Вежливый Scrapy: robots.txt, задержки, AutoThrottle

Мощный краулер обязан быть вежливым — иначе он навредит и сайту, и тебе.
Scrapy из коробки умеет соблюдать robots.txt, ограничивать скорость и адаптивно тормозить под нагрузку. Это не опции «для галочки», а основа ответственного скрейпинга.

Scrapy способен слать сотни запросов в секунду — и именно поэтому к нему прилагается ответственность. К счастью, вежливость встроена: достаточно правильно выставить настройки. Разберём ключевые из них в settings.py:

# settings.py — вежливые настройки

ROBOTSTXT_OBEY = True          # уважать robots.txt сайта
DOWNLOAD_DELAY = 1.0           # пауза 1 сек между запросами
CONCURRENT_REQUESTS_PER_DOMAIN = 2   # не больше 2 параллельных к домену

# адаптивная скорость: тормозит, если сервер отвечает медленно
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0

# честный User-Agent с контактом
USER_AGENT = 'my-research-bot/1.0 (+https://my-site.example/bot)'

# кэш — чтобы не перезапрашивать при отладке
HTTPCACHE_ENABLED = True

AutoThrottle: вежливость по обратной связи

AUTOTHROTTLE — умный механизм: он измеряет время ответа сервера и подстраивает задержку. Если сервер «устал» (отвечает медленно), Scrapy сам притормаживает. Это защищает чужой сайт от перегрузки лучше любой фиксированной паузы.

  быстрый ответ сервера   ->  Scrapy чуть ускоряется
  медленный ответ сервера ->  Scrapy замедляется (бережёт сайт)
  ошибки 429 / 503        ->  Scrapy ещё сильнее тормозит

  цель: нагрузка ~= один параллельный запрос, как вежливый человек

Как работает под капотом

RobotsTxtMiddleware при ROBOTSTXT_OBEY=True перед каждым запросом скачивает и читает /robots.txt сайта и пропускает только разрешённые пути. DOWNLOAD_DELAY добавляет паузу (с лёгким случайным разбросом, чтобы не выглядеть машинно-ровно). AUTOTHROTTLE по времени отклика вычисляет задержку динамически. HTTPCACHE сохраняет ответы локально, чтобы при отладке парсера не бить по сайту снова и снова. Вместе это превращает мощный краулер в вежливого гостя.

Вежливость как инженерная настройка

Удобство Scrapy в том, что этичное поведение здесь не требует силы воли — оно конфигурируется. Помимо задержек и robots.txt, фреймворк умеет ограничивать глубину обхода (DEPTH_LIMIT), общее число страниц (CLOSESPIDER_PAGECOUNT) и время работы — чтобы случайный баг не превратил краулер в бесконечный обход всего интернета. Тайм-ауты и повторы (RETRY_TIMES) делают паука устойчивым к временным сбоям без агрессивного давления на сервер.

Особого внимания заслуживает идентификация. Честный USER_AGENT с названием бота и контактным URL — это не маскировка, а наоборот, открытость: владелец сайта, увидев такой запрос в логах, понимает, кто к нему пришёл и как связаться. Многие администраторы спокойно относятся к вежливым, представившимся ботам и блокируют именно анонимные агрессивные. Поэтому связка «низкая частота + AutoThrottle + честный UA + соблюдение robots.txt» — это не только техническая страховка от блокировок, но и репутационная: она показывает, что ты собираешь данные открыто и ответственно.

Частые ошибки

  • Выключать ROBOTSTXT_OBEY ради скорости. Игнор robots.txt — сигнал недобросовестности и аргумент против тебя в споре.
  • Ставить нулевую задержку и высокий параллелизм. Это фактически мини-DDoS чужого сервера.
  • Не включать кэш при отладке. Каждый перезапуск парсера бьёт по живому сайту без нужды.

Best practices

  • Держи ROBOTSTXT_OBEY = True и AUTOTHROTTLE_ENABLED = True.
  • Ставь разумные DOWNLOAD_DELAY и низкий параллелизм на домен.
  • Указывай честный USER_AGENT с контактом и включай HTTPCACHE при разработке.

Полезно завести привычку тестового прогона. Перед полным обходом запусти паука с жёстким ограничением (CLOSESPIDER_PAGECOUNT=10) и посмотри логи: какие коды ответов приходят, не ловишь ли 429, корректно ли извлекаются поля. Маленький прогон выявляет проблемы, не нагружая сайт тысячами запросов впустую. Только убедившись, что паук ведёт себя вежливо и парсит верно, запускают полный краулинг. Этот «разведочный» подход экономит и нервы, и доброе имя перед владельцем ресурса.

Стоит помнить и о времени суток. Запускать тяжёлый краулинг по чужому сайту разумнее в часы низкой нагрузки (ночью по часовому поясу сервера), когда твои запросы менее заметны на фоне обычного трафика и не мешают живым пользователям. Это простой, но красноречивый жест уважения к владельцу ресурса. Вместе с задержками, ограничением параллелизма и AutoThrottle выбор удачного времени делает сбор данных практически незаметным для сайта — а именно незаметность и есть признак по-настоящему вежливого скрейпера.

Итог: вежливость в Scrapy — это пара строк в настройках: robots.txt, задержки, AutoThrottle и честный User-Agent. Мощность инструмента обязывает использовать её ответственно.

Проверьте себя
1. Что делает механизм AUTOTHROTTLE в Scrapy?
AУскоряет краулинг до максимума
BАдаптивно подстраивает задержку под время ответа сервера, замедляясь при нагрузке
CОтключает robots.txt
DМеняет User-Agent
2. Почему не стоит выключать ROBOTSTXT_OBEY ради скорости?
AЭто сломает Scrapy
BИгнорирование robots.txt — сигнал недобросовестности и аргумент против тебя в правовом споре
CБез него не работает экспорт
Drobots.txt ускоряет краулинг