Промежуточное ПО загрузчика¶
Промежуточное ПО загрузчика представляет собой фреймворк хуков для обработки запросов/ответов 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
.
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
Чего не хватает:
Pragma: no-cache
поддерживает https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1Поддержка заголовка
Vary
https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6Недействительность после обновления или удаления https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.10
… наверное другие ..
Серверная часть хранилища файловой системы (по умолчанию)¶
- class scrapy.extensions.httpcache.FilesystemCacheStorage¶
Серверная часть хранилища файловой системы доступна для промежуточного программного обеспечения кеширования HTTP.
Каждая пара запрос/ответ хранится в отдельном каталоге, содержащем следующие файлы:
request_body
— простое тело запросаrequest_headers
— заголовки запроса (в необработанном формате HTTP)response_body
— простое ответное телоresponse_headers
— заголовки запроса (в формате сырого HTTP)meta
— некоторые метаданные этого ресурса кеша в формате Pythonrepr()
(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_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:
Protego (по умолчанию)
Вы можете изменить парсер 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.
Чтобы использовать данный парсер, устанавливает:
С
ROBOTSTXT_PARSER
поscrapy.robotstxt.PythonRobotParser
Парсер Reppy¶
На основе Reppy:
представляет собой оболочку Python вокруг Анализатор протокола исключения Robots для C++
соответствует Проекту спецификации Мартина Костера 1996 г.
поддерживает сопоставление с подстановочными знаками
использует правило, основанное на длине
Собственная реализация, обеспечивает лучшую скорость, чем Protego.
Для того, чтобы использовать данный парсер:
Устанавливает Reppy, запустив
pip install reppy
Предупреждение
Проблема восходящего потока #122 предотвращает использование reppy в Python 3.9+.
Устанавливает параметр
ROBOTSTXT_PARSER
наscrapy.robotstxt.ReppyRobotParser
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
.