Перейти к содержимому
Инструменты

Парсер Product Hunt: фильтр сотрудников считает не то

Парсер Product Hunt: фильтр сотрудников считает не то

Парсер Product Hunt из репозитория swan4er/startup-finder собирает лаунчи в таблицу Excel за один прогон, но три фильтра из четырёх считают не то, что обещают их названия. Ниже — линейная инструкция от установки Python до проверки готовой выгрузки, с точными текстами подсказок, которые вы увидите на экране.

Разбор кода и объяснение, почему фильтры врут, лежит внутри шагов — там, где это влияет на то, что вы вводите. Этап Crunchbase мы пропускаем и заменяем ручной проверкой пяти компаний: он нарушает условия площадки и в разобранном прогоне вернул пустую колонку у всех 49 найденных компаний.

Что понадобится и сколько времени

Из софта — только браузер, Терминал и Python 3.8 или новее. Аккаунт Product Hunt нужен, аккаунт Crunchbase не нужен. Весь путь занимает около 45 минут, половина из них — ожидание установки библиотек и парсинга.

Порядок такой: проверяем Python, получаем Developer Token, скачиваем проект, ставим библиотеки, запускаем скрипт с четырьмя ответами, читаем таблицу по пяти признакам, проверяем пять компаний руками.

Во всех командах ниже я пишу python3 и pip3 — это вариант для macOS. На Windows везде убирайте тройку: python и pip. Больше нигде разницы не будет.

Готовим Python и токен Product Hunt

Шаг 1. Открыть Терминал

На macOS нажмите Cmd + Space, наберите Терминал и нажмите Enter. На Windows нажмите Win, наберите cmd, нажмите Enter.

На экране появится окно с текстовой строкой, которая заканчивается символом %, $ или >, и мигающим курсором.

Шаг 2. Проверить версию Python

Скопируйте команду, вставьте в окно Терминала через Cmd + V или Ctrl + V и нажмите Enter.

python3 --version

На Windows:

python --version

Должна появиться строка вида Python 3.12.2. Цифры могут отличаться, важно, чтобы первая была 3, а вторая — 8 или больше: README проекта требует Python 3.8+.

Если появилось command not found, откройте страницу загрузки Python, нажмите жёлтую кнопку Download Python в центре, откройте скачанный файл и пройдите установщик, ничего не меняя. На Windows в первом окне установщика поставьте галочку Add python.exe to PATH внизу — без неё команды не заработают. Затем закройте Терминал, откройте заново и повторите шаг.

Шаг 3. Войти в аккаунт Product Hunt

Откройте в браузере https://www.producthunt.com/. Увидите ленту продуктов, справа сверху — кнопку Sign in или вашу аватарку.

Если аватарки нет, нажмите Sign in в правом верхнем углу, в открывшемся окне выберите Continue with Google и подтвердите вход. После входа в правом верхнем углу появится круглая аватарка.

Шаг 4. Открыть страницу приложений

Не ищите её в меню, откройте прямым адресом: https://api.producthunt.com/v2/oauth/applications

Этот адрес скрипт печатает сам в config_manager.py. В README проекта указан другой — https://www.producthunt.com/v2/oauth/applications — он ведёт не туда, не используйте его.

На экране будет страница про OAuth applications с кнопкой создания приложения. Если вас перекинуло на страницу входа, вернитесь к шагу 3.

Кнопка подписана по-разному в разных версиях интерфейса: в коде скрипта она названа Create an application, на видеозаписи подписана Add an Application. Это одна и та же кнопка в верхней части списка. Нажмите ту, что есть у вас.

Шаг 5. Заполнить форму приложения

В поле Name напишите любое имя латиницей:

parser

В поле Redirect URI вставьте ровно это, вместе со слешем на конце:

https://localhost/

Это адрес-заглушка. Скрипт работает по Developer Token и на Redirect URI никогда не пойдёт, но поле обязательное. Если после отправки формы оно подсветится красным, впишите вместо него https://example.com/ — на работу токена это не влияет.

Нажмите Create Application внизу формы.

Шаг 6. Создать токен

Откроется страница вашего приложения с блоками API Key и API Secret. Они не нужны, не копируйте их.

Найдите на той же странице кнопку Create Token и нажмите её. Появится блок Developer Token с длинной строкой из букв, цифр, дефисов и подчёркиваний — в подсказке скрипта её формат описан как abc123-defGHI456_jklMNO789.

Шаг 7. Скопировать токен

Выделите строку токена мышкой целиком, от первого символа до последнего, и нажмите Cmd + C или Ctrl + C.

В буфере должна быть длинная строка без пробелов внутри. README называет три причины ошибки 401: скопировали API Key вместо Developer Token, захватили пробел по краям, приписали слово Bearer. Префикс скрипт добавляет сам, вам его писать не нужно.

Вкладку не закрывайте, токен понадобится вставить в Терминал.

Скачиваем проект и ставим библиотеки

Шаг 8. Перейти в папку для проекта

cd ~/Documents

На Windows:

cd %USERPROFILE%\Documents

Ничего не напечатается, но в начале строки появится Documents. Значит вы внутри папки.

Шаг 9. Скачать проект

git clone https://github.com/swan4er/startup-finder.git

Побегут строки Cloning into 'startup-finder'... и remote: Enumerating objects, в конце — done.

Если ответ git: command not found, на macOS всплывёт окно с предложением установить инструменты разработчика — нажмите Установить и подождите. На Windows скачайте Git с https://git-scm.com/download/win, пройдите установщик без изменений, закройте Терминал, откройте заново и повторите шаги 8 и 9.

Шаг 10. Войти в папку и проверить файлы

cd startup-finder

В начале строки Терминала появится startup-finder. Теперь посмотрите содержимое:

ls

На Windows — dir. В списке обязательно должны быть main.py, requirements.txt, producthunt_parser.py, crunchbase_parser.py, config_manager.py, utils.py. Если main.py нет, вы не в той папке.

Шаг 11. Создать виртуальное окружение

python3 -m venv venv

Команда думает 5–15 секунд и молча возвращает строку ввода. Сообщения об успехе не будет, это нормально: в папке проекта просто появится подпапка venv.

Шаг 12. Активировать окружение

source venv/bin/activate

На Windows:

venv\Scripts\activate

В начале строки Терминала появится приписка (venv). Это важный признак: если её нет, библиотеки поставятся не туда и скрипт на запуске скажет, что не находит модули.

Шаг 13. Установить библиотеки

pip3 install -r requirements.txt

Побегут строки Collecting requests, Collecting openpyxl, Collecting tqdm, Collecting camoufox, Collecting playwright — это ровно те пять библиотек, что перечислены в requirements.txt. Установка займёт 1–3 минуты, playwright весит много.

Признак успеха: последняя строка начинается со Successfully installed. Жёлтые предупреждения про новую версию pip игнорируйте.

Запускаем парсер и отвечаем на четыре вопроса

Шаг 14. Что знать перед запуском

В первых строках main.py стоит ssl._create_default_https_context = ssl._create_unverified_context. Это отключает проверку TLS-сертификатов для всех запросов скрипта, а ходит он и на API, и на сайты компаний из выгрузки. При разовом запуске дома ничего не случится, но трафик этого процесса не защищён от подмены, и в рабочей сети так делать не стоит. Строку не трогайте: без неё скрипт упадёт на части сайтов.

Шаг 15. Запустить скрипт

python3 main.py

Появится рамка из знаков равенства с заголовком ПОИСК ИДЕИ ДЛЯ СТАРТАПА, затем блок НАСТРОЙКА ТОКЕНА PRODUCTHUNT с инструкцией из семи пунктов и в конце строка:

Введите токен ProductHunt:

Шаг 16. Вставить токен

Курсор стоит после двоеточия. Нажмите Cmd + V, а на Windows — правую кнопку мыши или Ctrl + V. Нажмите Enter.

Должна появиться строка Токен сохранен в config.json. Теперь токен лежит в файле config.json внутри папки проекта, при следующих запусках его спрашивать не станут. Файл внесён в .gitignore, в публичный репозиторий он не уедет.

Если строка не появилась и курсор просто перескочил на новую строку, вставка не сработала — наберите токен вручную.

Шаг 17. Четыре вопроса про настройки

Появится блок НАСТРОЙКИ ПАРСИНГА и четыре вопроса подряд. После каждого ответа жмите Enter.

Первый вопрос — За сколько лет собирать проекты? [По умолчанию: 3]: — отвечайте 3. Учтите, что период считается как years*365 дней назад от сегодня, без високосных, поэтому начальная дата съедет на пару дней.

Второй вопрос — Черный список слов через запятую [По умолчанию: пусто]: — вводите строго латиницей:

crypt,nft,token,wallet

Метод _is_blacklisted получает единственный аргумент — имя продукта, приводит его к нижнему регистру и ищет вхождение подстроки. Названия на Product Hunt латинские, поэтому русское «крипт» не совпадёт ни с чем и фильтр отработает пустым. Описание и категории не проверяются вообще: проект с названием Wallet Buddy вы отсеете, а криптопроект с нейтральным именем пройдёт.

Третий вопрос — Максимальное количество сотрудников [По умолчанию: 10]: — отвечайте 4, а не единицей.

В коде это одна строка: makers_count = len(node.get('makers', [])), и отсев if makers_count > self.max_makers: return None. Makers — это люди, отмеченные авторами конкретного лаунча, а не штат компании. Площадка определяет мейкера как любого, кто решает свои задачи с помощью технологий и делится результатом. У продукта с командой из двухсот человек в лаунче может быть отмечен один маркетолог. Хуже другое: если мейкеров не отметили вовсе, массив приходит пустым, len([]) даёт ноль, и ноль всегда меньше вашего лимита. Единица не отсекает крупных вендоров, зато режет живые команды из двух-трёх человек.

Четвёртый вопрос — Лимит количества проектов [По умолчанию: 5000]: — отвечайте 100.

Product Hunt даёт приложению 6250 очков сложности каждые 15 минут для GraphQL-эндпоинта, при исчерпании возвращает 429. Скрипт ловит rate_limit_reached, читает reset_in и уходит в сон, а если сервер не сказал сколько ждать — спит 700 секунд. Отсюда и берутся многочасовые прогоны на больших лимитах.

Шаг 18. Дождаться сбора

Побежит прогресс-бар с растущим числом собранных проектов — на сотне это меньше минуты. Затем отдельным этапом пойдёт проверка сайтов: скрипт открывает ссылки компаний в 20 потоков и отбрасывает мёртвые. В разобранном прогоне из 100 проектов доступными оказались 94, отфильтровано 6.

Шаг 19. Отказаться от Crunchbase

Появится вопрос:

Продолжить с парсингом Crunchbase? (Y/n):

Напишите строчную латинскую n и нажмите Enter. Именно букву: в коде условие выглядит как continue_input not in ['', 'y', 'yes', 'д', 'да'], то есть пустая строка считается согласием. Нажмёте просто Enter — запустится браузер и потребует вход в Crunchbase.

Появится Сохранение результатов в producthunt.xlsx, затем Файл сохранен: producthunt.xlsx и число записей. Файл сохраняется до вопроса про Crunchbase, так что данные вы уже не потеряете.

Как понять, что зацепило вашу выгрузку

Шаг 20. Открыть файл

open producthunt.xlsx

На Windows:

start producthunt.xlsx

Откроется Excel, Numbers или LibreOffice. Первая строка выделена жирным, в ней семь колонок: name, description, votesCount, website, producthunt_url, makers, created_at. Колонок crunchbase_url и funding_amount не будет — код добавляет их только при согласии на второй этап.

Если файл не открылся, найдите его руками: «Документы» — startup-finderproducthunt.xlsx.

Шаг 21. Пять признаков в таблице

  • Нули в колонке makers. Кликните на букву колонки F, откройте вкладку «Данные», нажмите «Сортировка», выберите «От минимального к максимальному». Строки с нулём — лаунчи без отмеченных мейкеров, они прошли фильтр автоматически, размер команды по ним неизвестен.
  • Названия крупных вендоров в колонке A. Если видите модели и релизы больших платформ — фильтр по «сотрудникам» вас не защитил. В разобранном прогоне с лимитом в одного сотрудника в выборку попал лаунч Claude 3.5 Sonnet с 684 голосами.
  • Проекты из вашего чёрного списка. Если они остались и в названии нет ваших стоп-слов — фильтр отработал корректно по своей логике и бесполезно по вашей задаче.
  • Колонка votesCount. Запрос идёт с сортировкой order: VOTES, поэтому это голоса за три года, сигнал внимания, а не выручки. Шестьсот голосов и ноль инвестиций — совместимые вещи.
  • Колонка created_at. Самая старая дата должна быть примерно на три года назад, а не на месяц.

Ни один из этих пунктов не лечится увеличением лимита с 100 до 5000. Вы получите те же искажения, только в пятьдесят раз дольше.

Правим колонку и проверяем инвестиции руками

Шаг 22. Переименовать колонку makers

Файл уже открыт. Найдите ячейку F1 — первая строка, шестая колонка, в ней написано makers. Кликните по ней один раз и наберите с клавиатуры новый текст, старый затрётся сам:

отмечено мейкеров

Нажмите Enter, затем Cmd + S или Ctrl + S. Если спросит про формат, выбирайте «Оставить текущий формат».

Это снимает главную иллюзию, ради которой ставился фильтр. При следующем прогоне скрипт перезапишет файл и вернёт заголовок makers, так что перед новым запуском копируйте таблицу под другим именем.

Шаг 23. Отобрать пять проектов

Кликните на букву колонки C, откройте вкладку «Данные», нажмите «Сортировка», выберите «От максимального к минимальному». Возьмите пять верхних строк, у которых в колонке «отмечено мейкеров» стоит от 1 до 4, а не ноль, и скопируйте их адреса из колонки website в блокнот.

Шаг 24. Проверить Total Funding Amount

Для каждого адреса откройте https://www.crunchbase.com/, кликните на поле поиска в верхней части страницы, вставьте домен компании и нажмите Enter. В результатах кликните на карточку организации с совпадающим названием и найдите в сводке блок с подписью Total Funding Amount.

Вы увидите либо сумму, либо предложение оформить подписку, либо блока не будет вовсе. Любой исход — полезный ответ. Скрипт ищет сумму по элементу #overview_funding и берёт внутри первую ссылку, в тексте которой есть знак доллара. Если Crunchbase отдаёт разметку иначе или прячет цифру под платный доступ, метод молча вернёт пустоту: исключение проглочено через except Exception: pass, а прогресс-бар честно дойдёт до конца и напишет, что парсинг завершён.

Пять компаний руками — 10 минут. Автоматический прогон 300 компаний, по оценке с видеозаписи, около двух часов, и с риском получить пустой столбец.

Автоматический Crunchbase: чем за это платите

Если всё-таки хотите второй этап, сначала прочитайте цену. Модуль crunchbase_parser.py поднимает Camoufox — сборку Firefox для обхода антибот-защиты, с подменой user-agent, размеров окна, платформы, navigator.hardwareConcurrency и истории переходов; флаг i_know_what_im_doing включён. Первая строка файла — ссылка на гайд по обходу антибот-технологий с пометкой не удалять.

Условия Crunchbase от 26 ноября 2024 запрещают действия, которые «crawls, scrapes, or spiders any page, data, or portion of or relating to the Service or Content (through use of manual or automated means)», и отдельным пунктом — обход ограничений сервиса. Там же сказано, что нарушение любого из этих пунктов — основание для блокировки аккаунта. Вход вы делаете руками, и рискует именно тот аккаунт, которым вы вошли: если это рабочий Google, цена ошибки не ограничится Crunchbase.

Порядок такой. Запустите python3 main.py снова — так как файл producthunt.xlsx уже есть, появится меню НАЙДЕНА СУЩЕСТВУЮЩАЯ ТАБЛИЦА с тремя пунктами и строкой Ваш выбор [По умолчанию: 1]:. Напишите 2, это пункт «Продолжить с Crunchbase парсингом», тогда собранные данные не потеряются. Скрипт скачает браузер Camoufox — в первый раз это несколько минут — и откроет отдельное окно Firefox, где нужно пройти капчу и войти в Crunchbase, не закрывая браузер. После входа вернитесь в Терминал и нажмите Enter.

Внимание: дословные формулировки подсказок этого этапа проверить не удалось, файл crunchbase_parser.py целиком прочитать не получилось. По видеозаписи консоль просит пройти капчу, авторизоваться, не закрывать браузер и нажать Enter после успешного входа. Смысл шагов такой, текст может отличаться.

Ваша авторизованная сессия останется в папке user-data-dir/. Она внесена в .gitignore, но если скопируете проект в другую папку без этого файла или дадите ИИ-агенту право коммитить, куки уедут в публичный репозиторий вместе с кодом. Про разграничение прав агента у нас есть отдельный разбор с чек-листом.

И ограничение самого Product Hunt: документация API прямо говорит «By default the Product Hunt API must not be used for commercial purposes», для коммерческого применения предлагают написать им.

Проверка результата

  • В начале строки Терминала видна приписка (venv).
  • Команда ls в папке startup-finder показывает файлы config.json и producthunt.xlsx — оба создались сами, в скачанном репозитории их не было.
  • Таблица открывается, в первой строке жирным семь заголовков, шестой — переименованный вами «отмечено мейкеров».
  • Строк с данными столько же, сколько скрипт написал после слова Записей:.
  • В колонке website стоят адреса компаний. Часть строк со ссылкой на producthunt.com — норма: у таких лаунчей своего сайта нет.
  • Вы проверили пять компаний руками и знаете, показывает ли Crunchbase Total Funding Amount без подписки.

Быстрая проверка, что таблица не пустая, одной командой:

python3 -c "from openpyxl import load_workbook; w=load_workbook('producthunt.xlsx'); print('строк с данными:', w.active.max_row-1)"

Должна появиться строка вида строк с данными: 94.

Возможные ошибки

command not found: python3

Python не установлен либо на Windows не поставлена галочка Add python.exe to PATH. Переустановите с python.org, затем закройте и откройте Терминал. На macOS не пишите python без тройки — именно на этом падал ИИ-агент на видеозаписи.

ModuleNotFoundError: No module named ‘requests’

Библиотеки поставились не в то окружение или (venv) не активировано. Выполните по очереди:

source venv/bin/activate
pip3 install -r requirements.txt
python3 main.py

401 Unauthorized при парсинге Product Hunt

Скопирован API Key вместо Developer Token, захвачен пробел или приписан Bearer. Токен уже сохранён в config.json, поэтому заново его не спросят — файл нужно удалить:

rm config.json

На Windows — del config.json. Затем вернитесь к шагу 6, нажмите Create Token заново и запустите скрипт.

429 или сообщение про rate limit, скрипт замер

Исчерпаны 6250 очков сложности за 15 минут. Скрипт читает reset_in и засыпает, а если сервер время не сообщил — спит 700 секунд. Это не поломка, ждите. Прервать можно Ctrl + C. Чтобы не повторялось, держите лимит проектов в пределах 100–300.

Не найдено ни одного продукта по заданным критериям

Фильтры слишком узкие: скорее всего в чёрный список попало общее слово или сотрудников поставили единицей. Запустите заново, оставьте в чёрном списке только crypt, сотрудников поставьте 10.

Колонка funding_amount пустая у всех строк

Элемент #overview_funding не нашёл сумму: разметка изменилась или цифра под подпиской. Количеством это не лечится. Проверьте один crunchbase_url руками по шагу 24 и решайте, нужен ли официальный API: цену Crunchbase публично не публикует, доступ обсуждается через форму на их сайте.

Браузер Camoufox открылся и висит

README предлагает удалить папку сохранённой сессии и начать заново:

rm -rf user-data-dir

На Windows — rmdir /s /q user-data-dir. Затем запустите скрипт и выберите в меню пункт 2.

Кракозябры вместо русского текста в консоли Windows

Выполните chcp 65001 и запустите скрипт снова. На работу парсера кодировка консоли не влияет, только на читаемость подсказок.

Логика «выгрузил таблицу — значит проверил» ломается на любом парсере, не только на этом. Мы разбирали это на числах в материалах про реальную стоимость парсинга в Apify и про то, что именно попадает в выгрузку по конкурентам. Таблица врёт ровно так, как написан фильтр.

Источники