Обзор архитектуры
В этом документе описывается архитектура Scrapy и взаимодействие его компонентов.
Обзор
На следующей диаграмме показан обзор архитектуры Scrapy с её компонентами и схема потока данных, который происходит внутри системы (показано красными стрелками). Ниже приводится краткое описание компонентов со ссылками для получения более подробной информации о них. Поток данных также описан ниже.
Поток данных
Поток данных в Scrapy контролируется механизмом выполнения и происходит следующим образом:
Engine получает начальные запросы на сканирование от Spider.
Engine планирует запросы в Scheduler и запрашивает следующие запросы для сканирования.
Engine отправляет запросы на Downloader, проходя через Downloader Middlewares (см.
process_request()
).После завершения загрузки страницы Downloader генерирует ответ (с этой страницей) и отправляет его движку, проходя через Downloader Middlewares (см.
process_response()
).Engine получает ответ от Downloader и отправляет его на Spider для обработки, проходя через Spider Middleware (см.
process_spider_input()
).Spider обрабатывает ответ и возвращает извлеченные элементы и новые запросы (последующие) в Engine, проходя через Spider Middleware (см.
process_spider_output()
).Engine отправляет обработанные элементы на Item Pipelines, затем отправляет обработанные запросы на Scheduler и запрашивает возможные следующие запросы для сканирования.
Процесс повторяется (с шага 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 Знакомство - Крондо