Промежуточное ПО Spider

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

Активация ПО обеспечения-паука

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

Вот пример:

SPIDER_MIDDLEWARES = {
    'myproject.middlewares.CustomSpiderMiddleware': 543,
}

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

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

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

SPIDER_MIDDLEWARES = {
    'myproject.middlewares.CustomSpiderMiddleware': 543,
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None,
}

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

Написание собственного промежуточного ПО для пауков

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

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

class scrapy.spidermiddlewares.SpiderMiddleware
process_spider_input(response, spider)

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

process_spider_input() должен возвращать None или вызвать исключение.

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

Если это вызывает исключение, Scrapy не будет беспокоиться о вызове какого-либо другого промежуточного ПО паука process_spider_input() и вызовет запрос errback, если он есть, в противном случае он запустит цепочку process_spider_exception(). Выходные данные errback возвращаются в обратном направлении, чтобы process_spider_output() обработал его, или process_spider_exception(), если он вызвал исключение.

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

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

process_spider_output(response, result, spider)

Данный метод вызывается с результатами, возвращаемыми Spider после обработки ответа.

process_spider_output() должен возвращать итерацию из объектов Request и объект элемента.

Параметры
  • response (Response object) – ответ, который произвёл данный вывод от паука

  • result (an iterable of Request objects and item object) – результат, возвращаемый пауком

  • spider (Spider object) – паук, результат которого обрабатывается

process_spider_exception(response, exception, spider)

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

process_spider_exception() должен возвращать либо None, либо итерацию объектов Request или элемент.

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

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

Параметры
  • response (Response object) – ответ обрабатывается при возникновении исключения

  • exception (Exception object) – возникло исключение

  • spider (Spider object) – паук, вызвавший исключение

process_start_requests(start_requests, spider)

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

Он получает итерацию (в параметре start_requests) и должен возвращать другой итеративный объект Request.

Примечание

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

Параметры
  • start_requests (an iterable of Request) – запросы на запуск

  • spider (Spider object) – паук, которому принадлежат запросы на запуск

from_crawler(cls, crawler)

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

Параметры

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

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

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

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

DepthMiddleware

class scrapy.spidermiddlewares.depth.DepthMiddleware

DepthMiddleware используется для отслеживания глубины каждого запроса внутри сканируемого сайта. Он работает, устанавливая request.meta['depth'] = 0 всякий раз, когда ранее не задано значение (обычно это только первый запрос), и увеличивая его на 1 в противном случае.

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

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

  • DEPTH_LIMIT — максимальная глубина сканирования для любого сайта. Если ноль, никаких ограничений не будет.

  • DEPTH_STATS_VERBOSE — Следует ли собирать количество запросов для каждой глубины.

  • DEPTH_PRIORITY — устанавливать ли приоритет запросов в зависимости от их глубины.

HttpErrorMiddleware

class scrapy.spidermiddlewares.httperror.HttpErrorMiddleware

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

Согласно HTTP стандарта, успешные ответы — это те ответы, коды состояния которых находятся в диапазоне 200–300.

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

Например, если вы хотите, чтобы ваш паук обрабатывал 404 ответа, вы можете это сделать:

class MySpider(CrawlSpider):
    handle_httpstatus_list = [404]

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

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

Для получения дополнительной информации см .: HTTP Определения кодов состояния .

Настройки HttpErrorMiddleware

HTTPERROR_ALLOWED_CODES

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

Передать все ответы с кодами состояния, отличными от 200, которые содержатся в этом списке.

HTTPERROR_ALLOW_ALL

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

Передать все ответы, независимо от его кода состояния.

OffsiteMiddleware

class scrapy.spidermiddlewares.offsite.OffsiteMiddleware

Отфильтровывает запросы для URL-адресов за пределами доменов, охваченных пауком.

Данное промежуточное ПО отфильтровывает все запросы, имена хостов которых не указаны в атрибуте паука allowed_domains. Также разрешены все поддомены любого домена в списке. Например. правило www.example.org также разрешает bob.www.example.org, но не www2.example.com или example.com.

Когда ваш паук возвращает запрос на домен, не принадлежащий тем, на которые распространяется паук, данное промежуточное ПО регистрирует отладочное сообщение, подобное этому:

DEBUG: Filtered offsite request to 'www.othersite.com': <GET http://www.othersite.com/some/page.html>

Чтобы избежать заполнения журнала слишком большим количеством шума, он будет печатать только одно из данных сообщений для каждого нового отфильтрованного домена. Так, например, если другой запрос на www.othersite.com отфильтрован, сообщение журнала не будет напечатано. Но если запрос для someothersite.com отфильтрован, сообщение будет напечатано (но только для первого отфильтрованного запроса).

Если паук не определяет атрибут allowed_domains или атрибут пуст, внешнее промежуточное ПО разрешит все запросы.

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

RefererMiddleware

class scrapy.spidermiddlewares.referer.RefererMiddleware

Заполняет заголовок запроса Referer на основе URL-адреса ответа, который его сгенерировал.

Настройки RefererMiddleware

REFERER_ENABLED

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

Включать ли промежуточное ПО referer.

REFERRER_POLICY

По умолчанию: 'scrapy.spidermiddlewares.referer.DefaultReferrerPolicy'

Политика Referrer для применения при заполнении заголовка запроса «Referer».

Примечание

Вы также можете установить политику реферера для каждого запроса, используя специальный ключ "referrer_policy" Request.meta, с теми же допустимыми значениями, что и для параметра REFERRER_POLICY.

Допустимые значения для REFERRER_POLICY
  • либо путь к подклассу scrapy.spidermiddlewares.referer.ReferrerPolicy — настраиваемая политика или одна из встроенных (см. классы ниже)

  • или одно из стандартных строковых значений, определенных W3C ,

  • или специальный "scrapy-default".

Строковое значение

Имя класса (в виде строки)

"scrapy-default" (по умолчанию)

scrapy.spidermiddlewares.referer.DefaultReferrerPolicy

«no-referrer»

scrapy.spidermiddlewares.referer.NoReferrerPolicy

«no-referrer-when-downgrade»

scrapy.spidermiddlewares.referer.NoReferrerWhenDowngradePolicy

«same-origin»

scrapy.spidermiddlewares.referer.SameOriginPolicy

«origin»

scrapy.spidermiddlewares.referer.OriginPolicy

«strict-origin»

scrapy.spidermiddlewares.referer.StrictOriginPolicy

«origin-when-cross-origin»

scrapy.spidermiddlewares.referer.OriginWhenCrossOriginPolicy

«strict-origin-when-cross-origin»

scrapy.spidermiddlewares.referer.StrictOriginWhenCrossOriginPolicy

«unsafe-url»

scrapy.spidermiddlewares.referer.UnsafeUrlPolicy

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

Политика реферера Scrapy по умолчанию — точно такая же, как «no-referrer-when-downgrade», значение, рекомендованное W3C для браузеров — отправляет непустой заголовок «Referer» с любого http(s):// на любой URL-адрес https://, даже если домен отличается.

«same-origin» может быть лучшим выбором, если вы хотите удалить информацию реферера для междоменных запросов.

Примечание

Политика «no-referrer-when-downgrade» — это политика по умолчанию, рекомендованная W3C, и она используется основными веб-браузерами.

Однако это НЕ стандартная политика referrer Scrapy (см. DefaultReferrerPolicy).

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

НЕ рекомендуется использовать политику «небезопасный URL».

UrlLengthMiddleware

class scrapy.spidermiddlewares.urllength.UrlLengthMiddleware

Отфильтровывает запросы с URL длиннее URLLENGTH_LIMIT

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

  • URLLENGTH_LIMIT — максимальная длина URL, разрешенная для просканированных URL.