Обзор архитектуры

В этом документе описывается архитектура Scrapy и взаимодействие его компонентов.

Обзор

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

Поток данных

Архитектура Scrapy

Поток данных в Scrapy контролируется механизмом выполнения и происходит следующим образом:

  1. Engine получает начальные запросы на сканирование от Spider.

  2. Engine планирует запросы в Scheduler и запрашивает следующие запросы для сканирования.

  3. Scheduler возвращает следующие запросы к Engine.

  4. Engine отправляет запросы на Downloader, проходя через Downloader Middlewares (см. process_request()).

  5. После завершения загрузки страницы Downloader генерирует ответ (с этой страницей) и отправляет его движку, проходя через Downloader Middlewares (см. process_response()).

  6. Engine получает ответ от Downloader и отправляет его на Spider для обработки, проходя через Spider Middleware (см. process_spider_input()).

  7. Spider обрабатывает ответ и возвращает извлеченные элементы и новые запросы (последующие) в Engine, проходя через Spider Middleware (см. process_spider_output()).

  8. Engine отправляет обработанные элементы на Item Pipelines, затем отправляет обработанные запросы на Scheduler и запрашивает возможные следующие запросы для сканирования.

  9. Процесс повторяется (с шага 1) до тех пор, пока больше не будет запросов от Scheduler.

Компоненты

Scrapy Engine

Engine отвечает за управление потоком данных между всеми компонентами системы и запуск событий при выполнении определенных действий. См. раздел Поток данных выше для получения более подробной информации.

Scheduler

Scheduler получает запросы от двигателя и ставит их в очередь для последующей подачи (также в двигатель), когда двигатель их запрашивает.

Downloader

Downloader отвечает за загрузку веб-страниц и загрузку их в движок, который, в свою очередь, передаёт их паукам.

Spiders

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

Item Pipeline

Item Pipeline отвечает за обработку элементов после того, как они были извлечены (или очищены) пауками. Типичные задачи включают очистку, проверку и сохранение (например, сохранение элемента в базе данных). Для получения дополнительной информации см. Элемент конвейера.

Downloader middlewares

Downloader middlewares — это особые перехватчики, которые находятся между механизмом и загрузчиком и обрабатывают запросы, когда они передаются от механизма к загрузчику, и ответы, которые передаются от загрузчика к механизму.

Используйте промежуточное программное обеспечение Downloader, если вам нужно выполнить одно из следующих действий:

  • обрабатывать запрос непосредственно перед его отправкой в Downloader (т.е. прямо перед тем, как Scrapy отправит запрос на веб-сайт);

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

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

  • передать ответ пауку, не открывая веб-страницу;

  • молча сбросить несколько запросов.

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

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

Промежуточное ПО Spider — это особые перехватчики, которые находятся между Engine и Spider и могут обрабатывать ввод (ответы) и вывод (элементы и запросы) паука.

При необходимости используйте промежуточное ПО Spider

  • постобработка вывода обратных вызовов пауков — изменение/добавление/удаление запросов или элементов;

  • пост-процесс start_requests;

  • обрабатывать исключения пауков;

  • вызвать errback вместо обратного вызова для некоторых запросов на основе содержимого ответа.

Для получения дополнительной информации см. Промежуточное ПО Spider.

Event-driven networking

Scrapy написан на Twisted, популярной сетевой среде для Python, управляемой событиями. Таким образом, он реализован с использованием неблокирующего (также известного как асинхронный) кода для конкурентности.

Дополнительные сведения об асинхронном программировании и Twisted см. по этим ссылкам:

  • twisted:core/howto/defer-intro

  • Twisted - привет, асинхронное программирование

  • Twisted Знакомство - Крондо