Scrapy – мощный Python-фреймворк для веб-скрапинга, предоставляющий гибкий механизм обработки запросов и ответов через middleware. Middleware позволяют вмешиваться в процесс обработки, модифицировать запросы, фильтровать ответы и выполнять другие полезные задачи. В этой статье мы рассмотрим стандартные middleware Scrapy, их назначение и способы использования.
Что такое Middleware в Scrapy и зачем они нужны?
Общее понятие Middleware и их роль в Scrapy
Middleware в Scrapy – это компоненты, которые обрабатывают запросы и ответы на разных этапах жизненного цикла скрапинга. Они действуют как цепочка фильтров, позволяя вам настраивать и расширять функциональность Scrapy без изменения основного кода. Middleware используются для выполнения таких задач, как:
-
Модификация User-Agent.
-
Управление cookies.
-
Обработка перенаправлений.
-
Повторные попытки при ошибках.
-
Фильтрация нежелательного контента.
-
Преобразование данных.
Место middleware в жизненном цикле обработки запросов и ответов Scrapy
Middleware располагаются между движком Scrapy и загрузчиком (downloader) для запросов, и между движком Scrapy и spider-ами для ответов. Когда Scrapy отправляет запрос, он проходит через download middleware перед отправкой в интернет. Когда получается ответ, он проходит через download middleware после получения, и затем через spider middleware перед тем, как попасть в spider. Такая архитектура позволяет централизованно управлять обработкой данных.
Обзор Основных Стандартных Middleware Scrapy
Scrapy предоставляет набор стандартных middleware, готовых к использованию. Их можно настроить в файле settings.py.
Download Middleware: обработка запросов и ответов (User-Agent, Cookies, Redirect)
Download middleware обрабатывают запросы и ответы, связанные с загрузкой страниц. К ним относятся:
-
UserAgentMiddleware: Устанавливает User-Agent для запросов. Полезен для предотвращения блокировки со стороны веб-серверов. -
CookiesMiddleware: Обеспечивает поддержку cookies, позволяя вашему spider-у сохранять состояние сессии. -
RedirectMiddleware: Обрабатывает перенаправления (HTTP 301, 302 и т.д.). -
HttpProxyMiddleware: Добавляет поддержку прокси-серверов. -
RetryMiddleware: Автоматически повторяет неудачные запросы. -
DownloaderStats: Собирает статистику о загруженных страницах.
Spider Middleware: Преобразование ответов, обработка данных
Spider middleware обрабатывают ответы, полученные от веб-серверов, после download middleware, но перед обработкой spider-ом, а также запросы, генерируемые spider-ом.
-
DepthMiddleware: Отслеживает глубину запросов. -
HttpErrorMiddleware: Обрабатывает HTTP-ошибки (400, 500 и т.д.). Он должен быть включен, если требуется какая-либо логика обработки ошибок HTTP, в противном случае Scrapy будет просто поднимать исключения. -
OffsiteMiddleware: Фильтрует запросы на другие домены. Он позволяет Scrapy ограничиваться только теми доменами, которые указаны вallowed_domainsspider-а.Реклама -
RefererMiddleware: Устанавливает заголовок Referer для запросов. Полезно для имитации поведения браузера.
Практическое Использование и Настройка Стандартных Middleware
Примеры настройки User-Agent, CookiesMiddleware и RedirectMiddleware в settings.py
Чтобы настроить стандартные middleware, необходимо изменить файл settings.py вашего проекта Scrapy. Вот несколько примеров:
- Настройка User-Agent:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
- Отключение CookiesMiddleware (по умолчанию включен):
COOKIES_ENABLED = False
- Настройка RedirectMiddleware (по умолчанию включен):
REDIRECT_MAX_TIMES = 10 # Максимальное количество перенаправлений
Обработка ошибок с HttpErrorMiddleware: настройка и примеры
HttpErrorMiddleware по умолчанию включен и обрабатывает HTTP-ошибки, генерируя исключения. Чтобы перехватывать и обрабатывать эти ошибки, необходимо переопределить метод spider_error в вашем spider-е или создать кастомный download middleware.
Пример обработки HTTP-ошибок в spider-е:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://example.com/nonexistent_page']
def parse(self, response):
if response.status == 404:
self.logger.error(f'Страница не найдена: {response.url}')
# Дополнительная логика обработки 404 ошибки
else:
# Обработка успешного ответа
pass
Полезные Советы и Рекомендации по Работе с Middleware
Отключение и приоритеты middleware
Middleware активируются и деактивируются в файле settings.py с помощью словаря DOWNLOADER_MIDDLEWARES и SPIDER_MIDDLEWARES. Чем меньше число, тем выше приоритет.
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.CustomDownloaderMiddleware': 543,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, # Отключение UserAgentMiddleware
}
Создание собственных middleware и их интеграция со стандартными
Создание собственных middleware позволяет вам реализовать специфическую логику обработки запросов и ответов. Например, можно реализовать middleware для автоматического добавления анти-бот токенов, ротации прокси, или логирования.
Пример кастомного download middleware:
class CustomDownloaderMiddleware:
def process_request(self, request, spider):
# Добавление заголовка к запросу
request.headers['X-Custom-Header'] = 'MyValue'
return None
def process_response(self, request, response, spider):
# Обработка ответа
return response
def process_exception(self, request, exception, spider):
# Обработка исключений
pass
Затем этот middleware нужно активировать в settings.py:
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.CustomDownloaderMiddleware': 543,
}
Заключение
Стандартные middleware Scrapy предоставляют мощный и гибкий механизм для настройки и расширения функциональности фреймворка. Правильное использование стандартных и создание собственных middleware позволяет эффективно решать задачи веб-скрапинга, обрабатывать ошибки и адаптироваться к изменяющимся условиям веб-сайтов.