Для бизнеса · 5 мин
Парсинг цен без блокировок: вежливый сбор данных
Большинство блокировок при парсинге - реакция сайта на нагрузку, а не на сам факт сбора данных. Парсер, который запрашивает страницы в сотни потоков без пауз, похож на атаку, и сайт защищается. Вежливый сборщик ведёт себя иначе: берёт только нужное, не торопится, понимает сигналы сервера и распределяет запросы. Разберём, как это настроить.
- Команда TrueSocks
- 5 мин чтения
Сначала правила: что можно собирать
Прежде чем писать парсер, ответьте на три вопроса. Первый: данные публичные? Цены, наличие и описания товаров на витрине, как правило, видны любому посетителю. Данные из личных кабинетов и закрытых разделов - нет. Второй: что говорят условия использования сайта и файл robots.txt? Третий: есть ли официальный API или выгрузка?
- Официальный API или фид - лучший вариант: стабильный формат, понятные лимиты, меньше трафика.
- robots.txt показывает, какие разделы владелец сайта просит не обходить роботам, а иногда и желаемую паузу между запросами.
- Условия использования могут прямо ограничивать автоматический сбор. Если запрещено, поищите другой источник или договоритесь с владельцем.
Темп запросов: лимиты, паузы и параллельность
Главный рычаг - частота. Задайте ограничение на число запросов в секунду к одному домену и число одновременных соединений. Начинайте с малого и повышайте, только убедившись, что сайт отвечает без ошибок.
- Пауза между запросами к одному домену, а не только между пачками.
- Случайный разброс (jitter): вместо ровных интервалов добавляйте небольшое случайное отклонение, чтобы запросы не шли строго по таймеру.
- Лимит параллельности на домен и на каждый IP: несколько потоков вместо десятков.
- Расписание: тяжёлые обходы удобнее запускать в часы, когда у сайта меньше посетителей.
Честный User-Agent
Не выдавайте робота за браузер без необходимости. Понятный User-Agent с названием вашего сервиса и контактом позволяет владельцу сайта связаться с вами, а не сразу закрывать доступ. Если сайт отдаёт данные только браузеру, это повод задуматься, разрешён ли такой сбор.
Меньше запросов: кеш и условные запросы
Лучший запрос - тот, который не пришлось делать. Если цена товара обновляется раз в день, проверять её каждые пять минут бессмысленно. Храните ответы и задавайте каждому типу страниц свой срок актуальности.
Многие сайты поддерживают условные запросы. В первом ответе сервер присылает заголовки ETag или Last-Modified. При следующем обращении вы передаёте их обратно в If-None-Match или If-Modified-Since, и если страница не изменилась, сервер отвечает коротким 304 Not Modified без тела. Это экономит трафик и нагрузку с обеих сторон.
- Запрашивайте сжатые ответы (
Accept-Encoding: gzip). - Не скачивайте картинки, шрифты и скрипты, если нужен только текст.
- Если у сайта есть JSON-эндпоинт для витрины, он обычно легче HTML-страницы.
Слушайте сервер: 429, 503 и Retry-After
Сайт сам сообщает, что вы торопитесь. Код 429 Too Many Requests означает превышение лимита, 503 Service Unavailable - перегрузку или обслуживание. Часто к ним прилагается заголовок Retry-After с числом секунд или датой, после которой можно повторить запрос.
- Получили 429 или 503 - остановите запросы к этому домену с этого адреса.
- Если есть
Retry-After, подождите указанное время. - Если нет, используйте экспоненциальную задержку: каждый повтор ждёт дольше предыдущего, с верхней границей и случайным разбросом.
- Ограничьте число повторов. Не получилось за несколько попыток - отложите задачу на потом.
- Капча - тоже сигнал. Не пытайтесь её обойти: снизьте темп.
MAX_RETRIES = 4
BASE_DELAY = 2 # секунды
MAX_DELAY = 120
function polite_get(url, proxy):
wait_for_domain_slot(url) # лимит запросов и потоков на домен
sleep(random(0.5, 1.5) * PAUSE) # пауза с разбросом (jitter)
headers = cached_validators(url) # If-None-Match / If-Modified-Since
for attempt in 0..MAX_RETRIES:
resp = http_get(url, headers, proxy)
if resp.status == 304:
return cache.get(url)
if resp.status in (429, 503):
delay = resp.header('Retry-After')
or min(MAX_DELAY, BASE_DELAY * 2^attempt)
sleep(delay + random(0, 1))
proxy = pool.cooldown(proxy) # дать адресу отдохнуть
continue
cache.put(url, resp) # сохранить тело и ETag
return resp
defer(url) # отложить, не долбитьПул прокси: распределять, а не прятаться
Даже при аккуратном темпе один адрес упирается в лимит сайта, если страниц много. Пул прокси позволяет распределить нагрузку: каждый IP делает немного запросов, а суммарно задача выполняется в срок. Важно, что общий темп к сайту при этом не должен расти безгранично. Пул нужен, чтобы уложиться в разумные лимиты на адрес, а не чтобы обойти их и нагрузить сайт сильнее.
- Держите счётчик запросов и ошибок по каждому адресу.
- Адрес, получивший 429, отправляйте «отдыхать» на время, а не сразу в следующий запрос.
- Для сайтов с сессиями закрепляйте сессию за одним адресом, чтобы IP не менялся посреди сценария.
| Тип прокси | Когда подходит |
|---|---|
| Прокси для парсинга | Пакеты общих адресов: недорогой пул для лёгкого сбора с нетребовательных сайтов |
| Общие IPv4 | Небольшие задачи, на адресе до трёх клиентов |
| IPv4 Эконом | Индивидуальные адреса для регулярного мониторинга |
| Резидентские | Сайты, строгие к серверным адресам; ротация на каждый запрос или липкая сессия, оплата за ГБ |
Как посчитать объём трафика для резидентских прокси, описано в статье резидентские прокси по ГБ. Если сайт отказывает даже при вежливом темпе, загляните в разбор почему сайт блокирует прокси.
Короткий чек-лист перед запуском
- Данные публичные, условия сайта и
robots.txtпроверены, официального API нет или его недостаточно. - Задан лимит запросов и потоков на домен, паузы со случайным разбросом.
- Работает кеш, используются
ETagиIf-Modified-Since. - Обрабатываются 429 и 503 с учётом
Retry-After, число повторов ограничено. - Пул прокси с учётом ошибок по каждому адресу, персональные данные не собираются.
Список адресов в нужном формате для вашего парсера можно подготовить в конвертере прокси, а выгружать и продлевать адреса автоматически через REST API. Подробнее о сценариях на странице прокси для парсинга.
Вопросы и ответы
Сколько запросов в секунду можно делать к сайту?
Универсального числа нет. Если сайт указывает паузу в robots.txt или лимиты в документации API, следуйте им. Иначе начните с малой частоты, следите за кодами 429 и 503 и повышайте темп постепенно.
Помогают ли прокси обойти капчу?
Капча - сигнал, что запросов слишком много. Правильная реакция - снизить темп и распределить нагрузку, а не пытаться её обойти.
Какие прокси выбрать для мониторинга цен?
Для лёгких задач подойдут пакеты прокси для парсинга или IPv4 Эконом. Для сайтов, которые строго относятся к серверным адресам, резидентские прокси с оплатой за трафик.
Прокси для этой задачи
Цена «от» за единицу на базовый срок, страны и скидка за объём видны на странице товара.
- Выбрать страну
Прокси для парсинга
11 стран, от 59 ₽ за IP / 30 дней
- Выбрать страну
IPv4 Эконом
64 страны, от 216 ₽ за IP / 30 дней
- Выбрать страну
Резидентские
60 стран, от 149 ₽ за 1 ГБ / 30 дней
- #парсинг
- #мониторинг цен
- #rate limiting
- #прокси
Прокси предоставляются для законных задач. Спам, мошенничество и взлом запрещены, соблюдайте правила площадок. Правила сервиса
Читайте также
Все статьи- Для бизнеса
Резидентские прокси по ГБ: как посчитать расход трафика
Как оценить, сколько гигабайт резидентских прокси нужно под задачу: формула, замер на выборке, разбор примера, способы сократить трафик и когда выгоднее безлимит по времени.
5 мин · - Для бизнеса
Прокси для SEO и съёма позиций
Как настроить прокси для съёма позиций в поисковых системах разных стран: сколько адресов нужно и как это посчитать, что делать с капчей, IPv6 и резидентские адреса для проверки выдачи.
5 мин · - Для бизнеса
Прокси для Авито, Wildberries и Ozon: что нужно продавцу
Зачем продавцу на маркетплейсах прокси: кабинеты разных юрлиц, мониторинг цен конкурентов, проверка карточки в других регионах. Какие адреса выбрать и какие правила соблюдать.
5 мин ·