Расширение AutoThrottle

Это расширение для автоматического регулирования скорости сканирования в зависимости от нагрузки как сервера Scrapy, так и веб-сайта, который вы сканируете.

Цели дизайна

  1. лучше относиться к сайтам, вместо того, чтобы использовать нулевую задержку загрузки по умолчанию

  2. автоматически настраивает Scrapy на оптимальную скорость сканирования, поэтому пользователю не нужно настраивать задержки загрузки, чтобы найти оптимальную. Пользователю нужно только указать максимальное количество одновременных запросов, которое он разрешает, а расширение сделает всё остальное.

Как это работает

Расширение AutoThrottle динамически регулирует задержки загрузки, чтобы паук отправлял в среднем AUTOTHROTTLE_TARGET_CONCURRENCY одновременных запросов на каждый удалённый веб-сайт.

Он использует задержку загрузки для вычисления задержек. Основная идея заключается в следующем: если серверу требуется latency секунд для ответа, клиент должен отправлять запрос каждые latency/N секунд, чтобы запросы N обрабатывались параллельно.

Вместо настройки задержек можно просто установить небольшую фиксированную задержку загрузки и наложить жесткие ограничения на параллелизм, используя параметры CONCURRENT_REQUESTS_PER_DOMAIN или CONCURRENT_REQUESTS_PER_IP. Это даст аналогичный эффект, но с некоторыми важными отличиями:

  • поскольку задержка загрузки мала, будут периодически возникать всплески запросов;

  • часто ответы, отличные от 200 (ошибки), могут быть возвращены быстрее, чем обычные ответы, поэтому с небольшой задержкой загрузки и жёстким ограничением параллелизма поисковый робот будет отправлять запросы на сервер быстрее, когда сервер начинает возвращать ошибки. Но это противоположно тому, что должен делать краулер — в случае ошибок имеет смысл замедлиться: данные ошибки могут быть вызваны высокой частотой запросов.

AutoThrottle не имеет данных проблем.

Алгоритм регулирования

Алгоритм AutoThrottle регулирует задержки загрузки на основе следующих правил:

  1. пауки всегда запускаются с задержкой загрузки AUTOTHROTTLE_START_DELAY;

  2. при получении ответа целевая задержка загрузки рассчитывается как latency / N, где latency — это задержка ответа, а N — это AUTOTHROTTLE_TARGET_CONCURRENCY.

  3. Задержка загрузки для следующих запросов устанавливается равной среднему значению предыдущей задержки загрузки и целевой задержки загрузки;

  4. задержки ответов, отличных от 200, не могут уменьшить задержку;

  5. задержка загрузки не может быть меньше DOWNLOAD_DELAY или больше AUTOTHROTTLE_MAX_DELAY

Примечание

Расширение AutoThrottle учитывает стандартные настройки Scrapy для параллелизма и задержки. Это означает, что он будет учитывать параметры CONCURRENT_REQUESTS_PER_DOMAIN и CONCURRENT_REQUESTS_PER_IP и никогда не устанавливать задержку загрузки ниже DOWNLOAD_DELAY.

В Scrapy задержка загрузки измеряется как время, прошедшее между установлением TCP-соединения и получением HTTP-заголовков.

Обратите внимание, что данные задержки очень трудно точно измерить в среде совместной многозадачности, потому что Scrapy может быть занят, например, обработкой обратного вызова паука и не может посещать загрузки. Однако данные задержки по-прежнему должны давать разумную оценку того, насколько загружен Scrapy (и, в конечном итоге, сервер), и это расширение основывается на этой предпосылке.

Настройки

Параметры, используемые для управления расширением AutoThrottle:

Для получения дополнительной информации см. Как это работает.

AUTOTHROTTLE_ENABLED

По умолчанию: False

Включает расширение AutoThrottle.

AUTOTHROTTLE_START_DELAY

По умолчанию: 5.0

Начальная задержка загрузки (в секундах).

AUTOTHROTTLE_MAX_DELAY

По умолчанию: 60.0

Максимальная задержка загрузки (в секундах), устанавливаемая в случае высоких задержек.

AUTOTHROTTLE_TARGET_CONCURRENCY

По умолчанию: 1.0

Среднее количество запросов, которые Scrapy следует отправлять параллельно удаленным веб-сайтам.

По умолчанию AutoThrottle регулирует задержку для отправки одного одновременного запроса на каждый из удаленных веб-сайтов. Устанавливает для этого параметра более высокое значение (например, 2.0), чтобы увеличить пропускную способность и нагрузку на удаленные серверы. Более низкое значение AUTOTHROTTLE_TARGET_CONCURRENCY (например, 0.5) делает поискового робота более консервативным и вежливым.

Обратите внимание, что параметры CONCURRENT_REQUESTS_PER_DOMAIN и CONCURRENT_REQUESTS_PER_IP по-прежнему соблюдаются, когда включено расширение AutoThrottle. Это означает, что если для AUTOTHROTTLE_TARGET_CONCURRENCY задано значение выше, чем CONCURRENT_REQUESTS_PER_DOMAIN или CONCURRENT_REQUESTS_PER_IP, поисковый робот не достигнет этого количества одновременных запросов.

В каждый данный момент времени Scrapy может отправлять больше или меньше одновременных запросов, чем AUTOTHROTTLE_TARGET_CONCURRENCY; это рекомендуемое значение, к которому пытается приблизиться поисковый робот, а не жесткое ограничение.

AUTOTHROTTLE_DEBUG

По умолчанию: False

Включает режим отладки AutoThrottle, который будет отображать статистику по каждому полученному ответу, чтобы вы могли видеть, как параметры регулирования регулируются в реальном времени.