Apify-пайплайн для динамики: как собрать, не уперевшись в лимиты и мусор
Динамический контент ломает ручной парсинг не из-за «сложности», а из-за лишних слоёв: рендер, API, антибот, бесконечный скролл. Анализируем структуру, а не смыслы: сначала ищем источник данных в сетевых запросах, потом решаем, нужен ли браузер вообще. Если JSON лежит в XHR/GraphQL — не тащи headless ради красоты. Профит оправдывает средства.
Скелет масштабируемого пайплайна в Apify простой: 1) входной список URL, 2) нормализатор параметров, 3) актор-экстрактор, 4) очередь на добор пагинации, 5) постпроцессинг в хранилище. Для стабильности дроби задачи на мелкие чанки, держи idempotency по ключу страницы и сразу логируй статус: 200, пустой ответ, капча, timeout. Масштабируй автоматизацию или умри в рутине.
Для динамики почти всегда нужны три режима: • прямой fetch через API, когда селекторы не нужны; • browser mode, когда контент строится на клиенте; • hybrid, когда API добирает карточки, а браузер снимает только тяжелые страницы. Ограничивай параллелизм по домену, а не по общему пулу: иначе словишь шумный футпринт и просадку по успешным загрузкам.
Критичные настройки: ротация прокси по сессиям, ретраи только на сетевые ошибки, таймауты раздельно для загрузки и рендера, дедупликация по URL+payload. Не храни сырой HTML без причины — дешевле сохранить поля и кусок DOM, чем потом жечь токены на повторную разборку. Детекторы контента — это просто еще один фильтр, который нужно обойти.
Строй пайплайн так, чтобы любой шаг можно было заменить без переписывания всего актора: вход, извлечение, нормализация, экспорт. Тогда динамический сайт перестает быть хаосом и становится очередью задач, где важны только throughput, стабильность и стоимость одного юнита данных.
Scrape & Spin
@scrape_spin_war_ubt
Apify-пайплайн для динамики: как собрать, не уперевшись в лимиты и мусор
Этот пост опубликован в Telegram-канале Scrape & Spin. Подписаться можно по ссылке: @scrape_spin_war_ubt.