Промежуточное ПО загрузчика

Промежуточное ПО загрузчика представляет собой фреймворк хуков для обработки запросов/ответов Scrapy. Это легкая низкоуровневая система для глобального изменения запросов и ответов Scrapy.

Активация промежуточного программного обеспечения загрузчика

Чтобы активировать компонент промежуточного программного обеспечения загрузчика, добавьте его в параметр DOWNLOADER_MIDDLEWARES, который представляет собой dict, ключи которого являются путями к классам промежуточного программного обеспечения, а их значения — порядками промежуточного программного обеспечения.

Вот пример:

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomDownloaderMiddleware': 543,
}

Параметр DOWNLOADER_MIDDLEWARES объединяется с параметром DOWNLOADER_MIDDLEWARES_BASE, определенным в Scrapy (и не предназначен для переопределения), а затем сортируется по порядку, чтобы получить окончательный отсортированный список включенных промежуточных программ: первое промежуточное программное обеспечение находится ближе к движку, а последнее — на один ближе к загрузчику. Другими словами, метод process_request() каждого промежуточного программного обеспечения будет вызываться в возрастающем порядке промежуточного программного обеспечения (100, 200, 300, …), а метод process_response() каждого промежуточного программного обеспечения будет вызываться в порядке убывания.

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

Если вы хотите отключить встроенное промежуточное ПО (определенное в DOWNLOADER_MIDDLEWARES_BASE и включенное по умолчанию), вы должны определить его в настройке DOWNLOADER_MIDDLEWARES вашего проекта и назначить None в качестве его значения. Например, если вы хотите отключить промежуточное ПО пользовательского агента:

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomDownloaderMiddleware': 543,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}

Наконец, имейте в виду, что некоторые промежуточные программы могут потребовать включения определенных параметров. См. дополнительную информацию в документации по каждому промежуточному программному обеспечению.

Написание собственного промежуточного программного обеспечения загрузчика

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

Основная точка входа — это метод класса from_crawler, который получает экземпляр Crawler. Объект Crawler дает вам доступ, например, к настройкам.

class scrapy.downloadermiddlewares.DownloaderMiddleware

Примечание

Любой из методов промежуточного программного обеспечения загрузчика также может возвращать отложенный (deferred).

process_request(request, spider)

Данный метод вызывается для каждого запроса, проходящего через промежуточное ПО загрузки.

process_request() должен либо: возвращает None, возвращает объект Response, возвращает объект Request или вызвать IgnoreRequest.

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

Если он возвращает объект Response, Scrapy не будет беспокоиться о вызове любых других методов process_request() или process_exception() или соответствующей функции загрузки; он вернёт данный ответ. Методы установленного промежуточного программного обеспечения process_response() всегда вызываются при каждом ответе.

Если он возвращает объект Request, Scrapy перестанет вызывать методы process_request и перепланирует возвращённый запрос. После выполнения вновь возвращенного запроса для загруженного ответа будет вызвана соответствующая цепочка промежуточного программного обеспечения.

Если это вызывает исключение IgnoreRequest, будут вызваны методы process_exception() установленного промежуточного программного обеспечения загрузчика. Если ни один из них не обрабатывает исключение, вызывается функция запроса с ошибкой (Request.errback). Если никакой код не обрабатывает возникшее исключение, оно игнорируется и не логгируется (в отличие от других исключений).

Параметры
  • request (Request object) – обрабатываемый запрос

  • spider (Spider object) – паук, для которого предназначен данный запрос

process_response(request, response, spider)

process_response() должен либо: возвращать объект Response, либо возвращать объект Request, либо вызвать исключение IgnoreRequest.

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

Если он возвращает объект Request, цепочка промежуточного программного обеспечения останавливается, и возвращаемый запрос переносится на загрузку в будущем. Это такое же поведение, как если бы запрос был возвращён из process_request().

Если он вызывает исключение IgnoreRequest, вызывается функция запроса с ошибкой (Request.errback). Если никакой код не обрабатывает возникшее исключение, оно игнорируется и не регистрируется (в отличие от других исключений).

Параметры
  • request (is a Request object) – запрос, на который был получен ответ

  • response (Response object) – ответ обрабатывается

  • spider (Spider object) – паук, для которого предназначен данный ответ

process_exception(request, exception, spider)

Scrapy вызывает process_exception(), когда обработчик загрузки или process_request() (из промежуточного программного обеспечения загрузчика) вызывает исключение (включая исключение IgnoreRequest)

process_exception() должен возвращает: либо None, либо объект Response, либо объект Request.

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

Если он возвращает объект Response, запускается цепочка методов process_response() установленного промежуточного программного обеспечения, и Scrapy не будет вызывать никаких других методов промежуточного программного обеспечения process_exception().

Если он возвращает объект Request, возвращённый запрос переносится на загрузку в будущем. Это останавливает выполнение методов process_exception() промежуточного программного обеспечения так же, как и при возврате ответа.

Параметры
  • request (is a Request object) – запрос, вызвавший исключение

  • exception (an Exception object) – возбужденное исключение

  • spider (Spider object) – паук, для которого предназначен данный запрос

from_crawler(cls, crawler)

Если присутствует, данный метод класса вызывается для создания экземпляра промежуточного программного обеспечения из Crawler. Он должен возвращать новый экземпляр промежуточного программного обеспечения. Объект Crawler обеспечивает доступ ко всем основным компонентам Scrapy, таким как настройки и сигналы; это способ для промежуточного программного обеспечения получить к ним доступ и подключить его функциональность к Scrapy.

Параметры

crawler (Crawler object) – поисковый робот, использующий это промежуточное ПО

Справочник по встроенному промежуточному программному обеспечению загрузчика

На этой странице описаны все компоненты промежуточного программного обеспечения загрузчика, которые поставляются с Scrapy. Для получения информации о том, как их использовать и как написать собственное промежуточное программное обеспечение загрузчика, см. руководство по использованию промежуточного ПО загрузчика.

Список компонентов, включенных по умолчанию (и их порядок), см. в настройке DOWNLOADER_MIDDLEWARES_BASE.

CookiesMiddleware

class scrapy.downloadermiddlewares.cookies.CookiesMiddleware

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

Осторожно

Когда байтовые последовательности, не закодированные в UTF8, передаются на Request, CookiesMiddleware регистрирует предупреждение. Обратитесь к Расширенная настройка, чтобы настроить поведение журналирования.

Осторожно

Cookie, установленные с помощью заголовка Cookie, не рассматриваются CookiesMiddleware. Если вам нужно установить куки для запроса, используйте параметр Request.cookies. Это известное текущее ограничение, над которым сейчас работают.

Следующие параметры можно использовать для настройки промежуточного программного обеспечения cookie:

COOKIES_ENABLED

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

Включать ли промежуточное ПО для cookie. Если данный параметр отключён, cookie не будут отправляться на веб-серверы.

Обратите внимание, что, несмотря на значение параметра COOKIES_ENABLED, если Request.meta['dont_merge_cookies'] вычисляется как True, cookie запроса нет будут отправлены на веб-сервер, а полученные cookie в Response будут объединены с существующими файлами cookie.

Для получения более подробной информации см. параметр cookies в Request.

COOKIES_DEBUG

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

Если данный параметр включён, Scrapy будет регистрировать все cookie, отправленные в запросах (например, заголовок Cookie), и все cookie, полученные в ответах (например, заголовок Set-Cookie).

Вот пример журнала с включенным COOKIES_DEBUG:

2011-04-06 14:35:10-0300 [scrapy.core.engine] INFO: Spider opened
2011-04-06 14:35:10-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Sending cookies to: <GET http://www.diningcity.com/netherlands/index.html>
        Cookie: clientlanguage_nl=en_EN
2011-04-06 14:35:14-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Received cookies from: <200 http://www.diningcity.com/netherlands/index.html>
        Set-Cookie: JSESSIONID=B~FA4DC0C496C8762AE4F1A620EAB34F38; Path=/
        Set-Cookie: ip_isocode=US
        Set-Cookie: clientlanguage_nl=en_EN; Expires=Thu, 07-Apr-2011 21:21:34 GMT; Path=/
2011-04-06 14:49:50-0300 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.diningcity.com/netherlands/index.html> (referer: None)
[...]

DefaultHeadersMiddleware

class scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware

Это промежуточное ПО устанавливает все заголовки запросов по умолчанию, указанные в настройке DEFAULT_REQUEST_HEADERS.

DownloadTimeoutMiddleware

class scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware

Это промежуточное ПО устанавливает тайм-аут загрузки для запросов, указанных в параметре DOWNLOAD_TIMEOUT или атрибуте паука download_timeout.

Примечание

Вы также можете установить тайм-аут загрузки для каждого запроса с помощью ключа download_timeout Request.meta; это поддерживается, даже если DownloadTimeoutMiddleware отключён.

HttpAuthMiddleware

class scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware

Это промежуточное ПО аутентифицирует все запросы, сгенерированные определенными пауками, используя Базовую аутентификацию доступа (также известную как HTTP-аутентификация).

Чтобы включить HTTP-аутентификацию для паука, устанавливает атрибуты паука http_user и http_pass для данных аутентификации, а атрибут паука http_auth_domain для домена, который требует этой аутентификации (его поддомены также будут обрабатываться таким же образом). Вы можете установить http_auth_domain на None, чтобы включить аутентификацию для всех запросов, но вы рискуете утечь свои учетные данные для аутентификации в несвязанные домены.

Предупреждение

В предыдущих версиях Scrapy HttpAuthMiddleware отправлял данные аутентификации со всеми запросами, что является проблемой безопасности, если паук отправляет запросы в несколько разных доменов. В настоящее время, если атрибут http_auth_domain не установлен, промежуточное ПО будет использовать домен первого запроса, который будет работать для одних пауков, но не для других. В будущем промежуточное ПО будет выдавать ошибку.

Пример:

from scrapy.spiders import CrawlSpider

class SomeIntranetSiteSpider(CrawlSpider):

    http_user = 'someuser'
    http_pass = 'somepass'
    http_auth_domain = 'intranet.example.com'
    name = 'intranet.example.com'

    # .. rest of the spider code omitted ...

HttpCacheMiddleware

class scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware

Это промежуточное ПО обеспечивает низкоуровневый кеш для всех HTTP-запросов и ответов. Он должен сочетаться с серверной частью кеш-хранилища, а также политикой кеширования.

Scrapy поставляется с тремя механизмами хранения кеш-памяти HTTP:

Вы можете изменить серверную часть хранилища HTTP-кеша с помощью параметра HTTPCACHE_STORAGE. Или вы также можете реализовать собственное хранилище.

Scrapy поставляется с двумя политиками кеширования HTTP:

Вы можете изменить политику кеширования HTTP с помощью параметра HTTPCACHE_POLICY. Или вы также можете реализовать свою собственную политику.

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

Фиктивная (Dummy) политика (по умолчанию)

class scrapy.extensions.httpcache.DummyPolicy

Эта политика не учитывает какие-либо директивы HTTP Cache-Control. Каждый запрос и соответствующий ему ответ кешируются. Когда тот же запрос появляется снова, ответ возвращается без передачи чего-либо из Интернета.

Политика Фиктивная полезна для более быстрого тестирования пауков (без необходимости каждый раз ждать загрузки) и для проверки работы вашего паука в автономном режиме, когда подключение к Интернету недоступно. Цель состоит в том, чтобы иметь возможность «переиграть» запуск паука точно так же, как это было раньше.

Политика RFC2616

class scrapy.extensions.httpcache.RFC2616Policy

Эта политика обеспечивает HTTP-кеш, соответствующий RFC2616, т. е. с поддержкой HTTP Cache-Control, предназначенный для производства и используемый в непрерывных запусках, чтобы избежать загрузки неизмененных данных (для экономии полосы пропускания и ускорения сканирования).

Что реализовано:

  • Не пытаться сохранять ответы/запросы с установленной директивой cache-control no-store

  • Не обслуживать ответы из кеша, если директива no-cache cache-control установлена даже для свежих ответов

  • Вычислить время жизни свежести из директивы max-age cache-control

  • Вычислить время жизни свежести из заголовка ответа Expires

  • Вычислить время жизни свежести из заголовка ответа Last-Modified (эвристика, используемая Firefox)

  • Вычислить текущий возраст из заголовка ответа Age

  • Вычислить текущий возраст из заголовка Date

  • Подтвердите устаревшие ответы на основе заголовка ответа Last-Modified

  • Подтвердить устаревшие ответы на основе заголовка ответа ETag

  • Устанавливает заголовок Date для любого полученного ответа, в котором он отсутствует

  • Поддержка директивы управления кешем max-stale в запросах

Это позволяет паукам быть настроенными с использованием полной политики кеширования RFC2616, но избежать повторной проверки на основе запроса за запросом, оставаясь при этом совместимым со спецификацией HTTP.

Пример:

Добавить Cache-Control: max-stale=600 в заголовки запросов, чтобы принимать ответы, срок действия которых истёк не более чем на 600 секунд.

См. также: RFC2616, 14.9.3

Чего не хватает:

Серверная часть хранилища файловой системы (по умолчанию)

class scrapy.extensions.httpcache.FilesystemCacheStorage

Серверная часть хранилища файловой системы доступна для промежуточного программного обеспечения кеширования HTTP.

Каждая пара запрос/ответ хранится в отдельном каталоге, содержащем следующие файлы:

  • request_body — простое тело запроса

  • request_headers — заголовки запроса (в необработанном формате HTTP)

  • response_body — простое ответное тело

  • response_headers — заголовки запроса (в формате сырого HTTP)

  • meta — некоторые метаданные этого ресурса кеша в формате Python repr() (grep-friendly формат)

  • pickled_meta — те же метаданные в meta, но обработанные для более эффективной десериализации

Имя каталога создаётся на основе отпечатка запроса (см. scrapy.utils.request.fingerprint), и используется один уровень подкаталогов, чтобы избежать создания слишком большого количества файлов в одном каталоге (что неэффективно во многих файловых системах). Пример каталога может быть:

/path/to/cache/dir/example.com/72/72811f648e718090f041317756c03adb0ada46c7

Серверная часть хранилища DBM

class scrapy.extensions.httpcache.DbmCacheStorage

Бэкэнд хранилища DBM также доступен для промежуточного программного обеспечения кеширования HTTP.

По умолчанию он использует dbm, но вы можете изменить его с помощью параметра HTTPCACHE_DBM_MODULE.

Написание собственного бэкэнда хранилища

Вы можете реализовать бэкэнд кеш-хранилища, создав класс Python, который определяет методы, описанные ниже.

class scrapy.extensions.httpcache.CacheStorage
open_spider(spider)

Данный метод вызывается после того, как паук был открыт для сканирования. Он обрабатывает сигнал open_spider.

Параметры

spider (Spider object) – паук, который был открыт

close_spider(spider)

Данный метод вызывается после закрытия паука. Он обрабатывает сигнал close_spider.

Параметры

spider (Spider object) – паук, который был закрыт

retrieve_response(spider, request)

Возвращает ответ, если он присутствует в кеше, или None в противном случае.

Параметры
  • spider (Spider object) – паук, сгенерировавший запрос

  • request (Request object) – запрос на поиск кешированного ответа для

store_response(spider, request, response)

Сохранить данный ответ в кеше.

Параметры
  • spider (Spider object) – паук, для которого предназначен ответ

  • request (Request object) – соответствующий запрос, сгенерированный пауком

  • response (Response object) – ответ сохранить в кеше

Чтобы использовать серверную часть хранилища, устанавливает:

  • HTTPCACHE_STORAGE в путь импорта Python вашего пользовательского класса хранения.

Параметры промежуточного программного обеспечения HTTPCache

HttpCacheMiddleware можно настроить с помощью следующих параметров:

HTTPCACHE_ENABLED

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

Будет ли включён кеш HTTP.

HTTPCACHE_EXPIRATION_SECS

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

Срок действия кешированных запросов в секундах.

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

HTTPCACHE_DIR

По умолчанию: 'httpcache'

Каталог, используемый для хранения (низкоуровневого) HTTP-кеша. Если он пуст, кеш HTTP будет отключён. Если указан относительный путь, он берётся относительно каталога данных проекта. Для получения дополнительной информации см .: Стандартная структура проектов Scrapy.

HTTPCACHE_IGNORE_HTTP_CODES

По умолчанию: []

Не кешируйте ответ с этими HTTP-кодами.

HTTPCACHE_IGNORE_MISSING

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

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

HTTPCACHE_IGNORE_SCHEMES

По умолчанию: ['file']

Не кэшируйте ответы с этими схемами URI.

HTTPCACHE_STORAGE

По умолчанию: 'scrapy.extensions.httpcache.FilesystemCacheStorage'

Класс, реализующий бэкэнд кеш-хранилища.

HTTPCACHE_DBM_MODULE

По умолчанию: 'dbm'

Модуль базы данных для использования в серверной части хранилища DBM. Данный параметр специфичен для серверной части DBM.

HTTPCACHE_POLICY

По умолчанию: 'scrapy.extensions.httpcache.DummyPolicy'

Класс, реализующий политику кеширования.

HTTPCACHE_GZIP

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

Если данный параметр включён, все кэшированные данные будут сжиматься с помощью gzip. Данный параметр специфичен для серверной части файловой системы.

HTTPCACHE_ALWAYS_STORE

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

Если включено, страницы будут кэшироваться безоговорочно.

Паук может пожелать, чтобы все ответы были доступны в кэше, например, для будущего использования с Cache-Control: max-stale. DummyPolicy кэширует все ответы, но никогда не проверяет их повторно, и иногда желательна более подробная политика.

Данный параметр по-прежнему учитывает директивы Cache-Control: no-store в ответах. Если вы этого не хотите, отфильтруйте no-store из заголовков Cache-Control в ответах, которые вы передаете промежуточному программному обеспечению кеширования.

HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS

По умолчанию: []

Список игнорируемых директив Cache-Control в ответах.

Сайты часто устанавливают «no-store», «no-cache», «must-revalidate» и т. д., Но расстраиваются из-за трафика, который может генерировать паук, если он действительно соблюдает данные директивы. Это позволяет выборочно игнорировать директивы Cache-Control, которые заведомо не важны для сканируемых сайтов.

Мы предполагаем, что паук не будет выдавать директивы Cache-Control в запросах, если они ему действительно не нужны, поэтому директивы в запросах не фильтруются.

HttpCompressionMiddleware

class scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware

Это промежуточное ПО позволяет отправлять/получать сжатый (gzip, deflate) трафик с веб-сайтов.

Это промежуточное ПО также поддерживает декодирование ответов brotli-compressed и zstd-compressed при условии, что установлены brotlipy или zstandard соответственно.

Настройки HttpCompressionMiddleware

COMPRESSION_ENABLED

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

Будет ли включено промежуточное ПО сжатия.

HttpProxyMiddleware

class scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware

Это промежуточное программное обеспечение устанавливает прокси-сервер HTTP для использования для запросов, устанавливая мета-значение proxy для объектов Request.

Как и модуль стандартной библиотеки Python urllib.request, он подчиняется следующим переменным среды:

  • http_proxy

  • https_proxy

  • no_proxy

Вы также можете установить мета-ключ proxy для каждого запроса на такое значение, как http://some_proxy_server:port или http://username:password@some_proxy_server:port. Имейте в виду, что это значение будет иметь приоритет над переменными среды http_proxy / https_proxy, а также игнорировать переменную среды no_proxy.

RedirectMiddleware

class scrapy.downloadermiddlewares.redirect.RedirectMiddleware

Это промежуточное ПО обрабатывает перенаправление запросов в зависимости от статуса ответа.

URL-адреса, по которым проходит запрос (при перенаправлении), можно найти в ключе redirect_urls Request.meta.

Причину каждого перенаправления в redirect_urls можно найти в ключе redirect_reasons Request.meta. Например: [301, 302, 307, 'meta refresh'].

Формат причины зависит от промежуточного программного обеспечения, обработавшего соответствующее перенаправление. Например, RedirectMiddleware указывает код состояния инициирующего ответа как целое число, а MetaRefreshMiddleware всегда использует строку 'meta refresh' в качестве причины.

RedirectMiddleware можно настроить с помощью следующих параметров (дополнительную информацию см. в документации по настройкам):

Если Request.meta имеет ключ dont_redirect, установленный на True, запрос будет проигнорирован этим промежуточным программным обеспечением.

Если вы хотите обрабатывать некоторые коды статуса перенаправления в вашем пауке, вы можете указать их в атрибуте паука handle_httpstatus_list.

Например, если вы хотите, чтобы промежуточное ПО перенаправления игнорировало ответы 301 и 302 (и передавало их вашему пауку), вы можете сделать это:

class MySpider(CrawlSpider):
    handle_httpstatus_list = [301, 302]

Ключ handle_httpstatus_list в Request.meta также можно использовать, чтобы указать, какие коды ответов разрешать для каждого запроса. Вы также можете установить мета-ключ handle_httpstatus_all на True, если хотите разрешить любой код ответа для запроса.

Настройки RedirectMiddleware

REDIRECT_ENABLED

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

Будет ли включено промежуточное ПО Redirect.

REDIRECT_MAX_TIMES

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

Максимальное количество перенаправлений, которые будут выполняться для одного запроса. После этого максимума ответ на запрос возвращается как есть.

MetaRefreshMiddleware

class scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware

Это промежуточное ПО обрабатывает перенаправление запросов на основе тега мета-обновления html.

MetaRefreshMiddleware можно настроить с помощью следующих настроек (дополнительную информацию см. в документации по настройкам):

Это промежуточное ПО подчиняется настройке REDIRECT_MAX_TIMES, dont_redirect, redirect_urls и redirect_reasons запрашивают мета-ключи, как приведено для RedirectMiddleware

Настройки MetaRefreshMiddleware

METAREFRESH_ENABLED

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

Будет ли включено промежуточное ПО Meta Refresh.

METAREFRESH_IGNORE_TAGS

По умолчанию: []

Мета-теги в данных тегах игнорируются.

Изменено в версии 2.0: Значение по умолчанию METAREFRESH_IGNORE_TAGS изменено с ['script', 'noscript'] на [].

METAREFRESH_MAXDELAY

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

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

RetryMiddleware

class scrapy.downloadermiddlewares.retry.RetryMiddleware

Промежуточное ПО для повторения неудачных запросов, которые могут быть вызваны временными проблемами, такими как тайм-аут соединения или ошибка HTTP 500.

Неудачные страницы собираются в процессе парсинга и переносятся в конце, когда паук завершает сканирование всех обычных (исправных) страниц.

RetryMiddleware можно настроить с помощью следующих настроек (дополнительную информацию см. в документации по настройкам):

Если Request.meta имеет для ключа dont_retry значение True, запрос будет проигнорирован этим промежуточным программным обеспечением.

Чтобы повторить запросы от обратного вызова паука, вы можете использовать функцию get_retry_request():

Настройки RetryMiddleware

RETRY_ENABLED

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

Будет ли включено промежуточное ПО Retry.

RETRY_TIMES

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

Максимальное количество повторных попыток помимо первой загрузки.

Максимальное количество повторных попыток также можно указать для каждого запроса с помощью атрибута max_retry_times для Request.meta. При инициализации мета-ключ max_retry_times имеет более высокий приоритет над параметром RETRY_TIMES.

RETRY_HTTP_CODES

По умолчанию: [500, 502, 503, 504, 522, 524, 408, 429]

Какие коды ответа HTTP нужно повторить. Другие ошибки (проблемы с поиском DNS, потеря соединения и т. д.) Всегда повторяются.

В некоторых случаях вы можете захотеть добавить 400 к RETRY_HTTP_CODES, потому что это общий код, используемый для обозначения перегрузки сервера. Он не включён по умолчанию, потому что об этом говорится в спецификации HTTP.

RETRY_PRIORITY_ADJUST

По умолчанию: -1

Отрегулировать приоритет повторного запроса относительно исходного запроса:

  • положительная настройка приоритета означает более высокий приоритет.

  • настройка отрицательного приоритета (по умолчанию) означает более низкий приоритет.

RobotsTxtMiddleware

class scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware

Это промежуточное ПО отфильтровывает запросы, запрещенные стандартом исключения robots.txt.

Чтобы убедиться, что Scrapy уважает robots.txt, убедиться, что промежуточное программное обеспечение включено и параметр ROBOTSTXT_OBEY включён.

Параметр ROBOTSTXT_USER_AGENT можно использовать для указания строки пользовательского агента, которая будет использоваться для сопоставления в файле robots.txt. Если это None, заголовок User-Agent, который вы отправляете с запросом, или параметр USER_AGENT (в указанном порядке) будет использоваться для определения пользовательского агента в файле robots.txt.

Это промежуточное ПО должно быть объединено с парсером robots.txt.

Scrapy поставляется с поддержкой следующих парсеров robots.txt:

Вы можете изменить парсер robots.txt с настройкой ROBOTSTXT_PARSER. Или вы также можете реализовать поддержку нового парсера.

Если Request.meta имеет ключ dont_obey_robotstxt, установленный на True, запрос будет проигнорирован этим промежуточным программным обеспечением, даже если ROBOTSTXT_OBEY включён.

Парсеры различаются по нескольким аспектам:

  • Язык реализации

  • Поддерживаемая спецификация

  • Поддержка подстановочных знаков

  • Использование правила, основанное на длине: в частности, для директив Allow и Disallow, где наиболее конкретное правило, основанное на длине пути, имеет приоритет перед менее конкретным (более коротким) правилом

Сравнение производительности различных парсеров доступно по следующей ссылке.

Парсер Protego

На основе Protego:

  • реализован на Python

  • соответствует стандарту Спецификации Google Robots.txt

  • поддерживает сопоставление с подстановочными знаками

  • использует правило, основанное на длине

Scrapy использует данный синтаксический анализатор по умолчанию.

RobotFileParser

На основе RobotFileParser:

  • is Python’s built-in robots.txt parser

  • соответствует Проекту спецификации Мартина Костера 1996 г.

  • не поддерживает сопоставление с подстановочными знаками

  • не использует правило, основанное на длине

Он быстрее, чем Protego, и обратно совместим с версиями Scrapy до 1.8.0.

Чтобы использовать данный парсер, устанавливает:

Парсер Reppy

На основе Reppy:

  • представляет собой оболочку Python вокруг Анализатор протокола исключения Robots для C++

  • соответствует Проекту спецификации Мартина Костера 1996 г.

  • поддерживает сопоставление с подстановочными знаками

  • использует правило, основанное на длине

Собственная реализация, обеспечивает лучшую скорость, чем Protego.

Для того, чтобы использовать данный парсер:

Robotexclusionrulesparser

На основе Robotexclusionrulesparser:

  • реализован на Python

  • соответствует Проекту спецификации Мартина Костера 1996 г.

  • поддерживает сопоставление с подстановочными знаками

  • не использует правило, основанное на длине

Для того, чтобы использовать данный парсер:

  • Устанавливает Robotexclusionrulesparser, запустив pip install robotexclusionrulesparser

  • Устанавливает параметр ROBOTSTXT_PARSER на scrapy.robotstxt.RerpRobotParser

Реализация поддержки нового парсера

Вы можете реализовать поддержку нового парсера robots.txt, создав подкласс абстрактного базового класса RobotParser и реализовав методы, описанные ниже.

DownloaderStats

class scrapy.downloadermiddlewares.stats.DownloaderStats

Промежуточное ПО, которое хранит статистику всех запросов, ответов и исключений, которые проходят через него.

Чтобы использовать это промежуточное ПО, необходимо включить параметр DOWNLOADER_STATS.

UserAgentMiddleware

class scrapy.downloadermiddlewares.useragent.UserAgentMiddleware

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

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

AjaxCrawlMiddleware

class scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware

По промежуточного слоя, которое находит варианты страниц, доступные для сканирования AJAX, на основе мета-фрагмента html-тега. См. https://developers.google.com/search/docs/ajax-crawling/docs/getting-started для получения дополнительной информации.

Примечание

Scrapy находит страницы, доступные для сканирования AJAX, для URL-адресов, таких как 'http://example.com/!#foo=bar', даже без этого промежуточного программного обеспечения. AjaxCrawlMiddleware необходимо, если URL-адрес не содержит '!#'. Это часто бывает с «индексными» или «основными» страницами веб-сайта.

Настройки AjaxCrawlMiddleware

AJAXCRAWL_ENABLED

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

Будет ли включён AjaxCrawlMiddleware. Вы можете включить его для широких обходов.

Настройки HttpProxyMiddleware

HTTPPROXY_ENABLED

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

Включать или нет HttpProxyMiddleware.

HTTPPROXY_AUTH_ENCODING

По умолчанию: "latin-1"

Кодировка по умолчанию для аутентификации прокси на HttpProxyMiddleware.