Коротко и по делу — сначала важное: убедитесь, что парсинг не нарушает закон/условия сайта. Проверьте robots.txt и пользовательское соглашение, и при возможности запросите у магазина API/партнёра — это проще и безопаснее. Ниже — практические рекомендации и варианты реализации.
1) PHP vs Python — что выбрать
- PHP можно. Для «чистого HTML» (страницы без активного JS) PHP (cURL / Guzzle + DOMDocument / Symfony DomCrawler / simple_html_dom) прекрасно справится. Для 10k страниц это реальная задача.
- Если сайт рендерит всё через JavaScript (SPA, динамические XHR), то на PHP придётся либо:
- запускать внешний headless-браузер (Puppeteer/Playwright/Chrome) и управлять им из PHP (через локальные запросы/команды/selenium), либо
- пытаться расшифровать XHR/JSON-эндпоинты и дергать их напрямую (это самый лёгкий путь).
- Python даёт более богатую экосистему для парсинга: Scrapy (высокая скорость и удобный pipeline), aiohttp/httpx+BeautifulSoup (асинхронно), Playwright/Puppeteer/Selenium (для JS). Для большинства задач Scrapy/asyncio + поиск XHR достаточно и эффективнее Selenium.
Вывод: если сайт статический или можно использовать его XHR эндпоинты — спокойно делайте на PHP. Если нужен рендер JS и вы хотите простоту и производительность — Python (Scrapy или asyncio + Playwright) часто удобнее. Вызов Python-парсера из PHP по локальному HTTP (или через очередь) — хорошая архитектура.
2) Обойти защиту — реалистичность
- «Обойти» защиты целиком нелегально и рискованно. Но легитимные меры защиты можно обойти технически: использование прокси/ротации, имитация браузера, работа с XHR API.
- Часто не нужно эмулировать браузер целиком: найдите XHR/JSON-эндпоинты в DevTools — данные там часто доступны напрямую. Это самый быстрый, надёжный и малорисковый путь.
3) Нужно ли Selenium/«тяжёлые» инструменты?
- Не обязательно. Selenium — тяжёлая опция, медленнее. Современные лёгкие варианты:
- Playwright (быстрее, стабильнее, поддерживает headless Chrome/Firefox/WebKit; имеет Python и Node API),
- Puppeteer (Node),
- Playwright + headless mode + stealth/anti-detect (если нужно),
- splash (легкий рендерер на базе QT, но менее распространён).
- Перед применением headless-браузеров попытайтесь:
- найти JSON/XHR,
- искать данные в исходном HTML (в скриптах, data-атрибутах, JSON внутри страницы).
Если всё же нужен рендер — Playwright обычно предпочтительнее Selenium.
4) Архитектура для 10k товаров (рекомендации)
- Шаг 0: разведка — вручную в DevTools: sitemap, публичные API, XHR, пагинация, rate-limits, cookies, защита (bot-detect, captcha).
- Сбор ссылок/seed-URL: sitemap.xml, категории, пагинация.
- По возможности использовать JSON-эндпоинты (API).
- Сделать очередь заданий (Redis/RabbitMQ/DB), worker’ы, которые берут URL и парсят.
- Хранение: БД (Postgres/MySQL) или промежуточный CSV/JSON + потом в БД.
- Логи и чекпоинты: сохраняйте прогресс, чтобы можно было возобновить.
- Параллелизм: контролируйте число параллельных запросов и задержки. Начните консервативно.
5) Минимизировать риск блокировки — практики
- Не лезьте слишком быстро: разумные паузы и jitter (случайный разброс задержек).
- Ограничьте одновременные запросы с одного IP (например 1–5 req/s в зависимости от сайта).
- Ротация IP (прокси): пул датацентр/резидентных прокси. Резидентные надёжнее, но дороже.
- Ротация User-Agent, Accept-Language, Referer и других заголовков.
- Поддерживайте и используйте cookies/сессии, повторно используйте TCP-соединения (keep-alive).
- Обрабатывайте и реагируйте на 429/503/403 — делать экспоненциальный backoff и менять IP/UA/pauses.
- Имитируйте нормальное поведение браузера: заголовки, загружаемые ресурсы, порядок запросов (ссылки referer).
- Избегайте явных бот-шаблонов (одинаковые заголовки/тайминги).
- Детектируйте CAPTCHA — ставьте обработку вручную или сервис капч (если легально).
- Разбейте задание на окна по времени (распределяйте запросы в течение суток), чтобы не генерировать всплески.
- Не качайте статику (images/CSS/JS) лишний раз — парсите HTML и берите только необходимые поля.
- Добавьте «warming up»: сначала небольшой поток, дать время “привыкнуть”.
6) Конкретные технологии/стек
- PHP-стек (если без JS):
- HTTP: cURL (curl_multi), Guzzle (пул запросов).
- Парсинг: DOMDocument + DOMXPath, Symfony DomCrawler, simple_html_dom.
- Параллелизм: curl_multi или Swoole (если готовы к расширенной среде).
- Если нужна рендеринг JS — вызывать локальный Playwright/Puppeteer сервис или Selenium (php-webdriver).
- Python-стек (рекомендую для масштабных задач):
- Scrapy — идеален для 10k+ URL (встроенный Scheduler, Pipelines, AutoThrottle, отказоустойчивость).
- aiohttp + asyncio + BeautifulSoup или lxml — если хотите лёгкий кастомный скрипт.
- httpx + asyncio — современная async-клиентская альтернатива.
- Playwright/Puppeteer — для JS-рендеринга; Playwright быстрее Selenium.
- scrapy-playwright или scrapy-splash — если нужны возможности Scrapy + JS.
- Вызов Python из PHP:
- Запуск локального HTTP-сервиса (Flask/FastAPI) и запросы из PHP — удобно и масштабируемо.
- Или использовать очередь (Redis/RabbitMQ) — PHP кладёт задачи, Python workers выполняют парсинг.
7) Примеры (очень сжато)
- PHP (cURL + DOMDocument) — подход для простых страниц:
- Используйте curl_multi для параллельных запросов, затем DOMDocument->loadHTML + DOMXPath для извлечения.
- Python (aiohttp + BeautifulSoup):
- Асинхронный пул с семафором, fetch/parse, сохраняйте результаты в БД. При JS — Playwright.
8) Оценки производительности (ориентиры)
- Если запросы идут к «чистому» JSON, скорость ограничена сетевой задержкой и параллелизмом — 10k запросов при 100 параллельных воркерах может занять несколько минут — но это риск блокировки.
- При парсинге HTML с 1–5 req/s на IP — 10k = 2000–10000 с = ~30 мин — 3 часа. Подберите параметры осторожно.
9) Практический план на 10k товаров
1. Разведка: найти sitemap/JSON/API.
2. Если есть API/JSON — использовать его (самый быстрый вариан).
3. Если нет — собрать список product URLs (sitemap/категории).
4. Сделать рабочую очередь + 5–50 воркеров (зависит от прокси/правил сайта).
5. Использовать повторы, backoff, логирование.
6. Запускать партиями (например 1000 URL в ночь) и мониторить блокировки.
7. При блокировках снижайте скорость, добавляйте прокси/сменяйте UA или обратитесь к владельцу сайта.
10) Заключение — рекомендации
- Начните с ручной разведки DevTools — часто данные доступны через JSON-эндпоинты.
- Для статичных страниц PHP будет достаточен; для JS-heavy — Python + Playwright/Scrapy предпочтительнее.
- Не пытайтесь «обойти» сильные защиты массовым запросом — используйте ротацию, паузы, имитацию браузера и уважайте правила.
- Архитектурно: лучше сделать парсер как отдельный сервис (Python или PHP) и вызывать из основного PHP-приложения через локальный API/очередь.
Если хотите, могу:
- помочь с конкретным планом после того, как вы пришлёте пример страницы (структуру HTML / примеры product page),
- прислать пример кода (PHP cURL или Python aiohttp / Scrapy) под ваш кейс.