Scrapy – мощный фреймворк для веб-скрейпинга, позволяющий автоматизировать процесс сбора данных с веб-сайтов. Аргументы процесса обхода играют ключевую роль в настройке и управлении поведением spider’ов, позволяя гибко адаптировать их к различным задачам.
Что такое процесс обхода (crawl process) в Scrapy?
Процесс обхода – это основной цикл работы Scrapy, включающий в себя:
- Запуск spider’а.
- Отправку запросов на целевые веб-сайты.
- Обработку ответов с помощью определенных callback-функций.
- Извлечение данных и генерацию новых запросов.
- Сохранение полученных данных (например, в файлы или базы данных).
Зачем нужны аргументы процесса обхода?
Аргументы процесса обхода позволяют:
- Изменять параметры работы spider’а без необходимости изменения его кода.
- Адаптировать spider к различным условиям и задачам.
- Передавать различные конфигурационные данные.
Обзор основных типов аргументов процесса обхода
Аргументы процесса обхода можно разделить на несколько категорий:
- Аргументы командной строки: передаются при запуске Scrapy через терминал.
- Аргументы, определенные в settings.py: глобальные настройки Scrapy.
- Аргументы, передаваемые через API: используются при программном запуске Scrapy.
Передача аргументов в Scrapy spiders
Использование -a (или --set) для передачи аргументов из командной строки
Для передачи аргументов из командной строки используется опция -a (или --set):
scrapy crawl my_spider -a category=books -a page_number=1
Доступ к аргументам в spider’е через self.crawler.settings
Внутри spider’а аргументы доступны через атрибут self.crawler.settings:
import scrapy
class MySpider(scrapy.Spider):
name = "my_spider"
start_urls = ["http://example.com"]
def __init__(self, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.category = self.crawler.settings.get('category')
self.page_number = int(self.crawler.settings.get('page_number', 1))
def parse(self, response):
# Логика парсинга с использованием self.category и self.page_number
yield {
'category': self.category,
'page_number': self.page_number,
'title': response.css('title::text').get()
}
Передача аргументов через API Scrapy (например, при программном запуске)
При программном запуске Scrapy можно использовать CrawlerProcess и CrawlerRunner для передачи аргументов.
from scrapy.crawler import CrawlerProcess
from scrapy.settings import Settings
from my_project.spiders.my_spider import MySpider # Замените на ваш spider
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/5.0',
'category': 'electronics',
'page_number': 2
})
process.crawl(MySpider)
process.start()
Практические примеры использования аргументов процесса обхода
Настройка параметров spider’а (например, глубина обхода, задержка загрузки)
# settings.py
DEPTH_LIMIT = 2
DOWNLOAD_DELAY = 0.5
Или передача через командную строку:
scrapy crawl my_spider -s DEPTH_LIMIT=3 -s DOWNLOAD_DELAY=1
Изменение поведения spider’а в зависимости от аргументов (например, выбор разных парсеров)
Предположим, у нас есть разные парсеры в зависимости от типа страницы.
import scrapy
class MySpider(scrapy.Spider):
name = "my_spider"
start_urls = ["http://example.com"]
def __init__(self, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.parser_type = self.crawler.settings.get('parser_type', 'default')
def parse(self, response):
if self.parser_type == 'alternative':
yield self.parse_alternative(response)
else:
yield self.parse_default(response)
def parse_default(self, response):
# Логика парсинга по умолчанию
yield {'data': 'default parser'}
def parse_alternative(self, response):
# Альтернативная логика парсинга
yield {'data': 'alternative parser'}
Передача учетных данных для аутентификации
Храните учетные данные в settings и передавайте их через аргументы (но не напрямую в командной строке!).
Использование аргументов для выбора целевого URL
import scrapy
class MySpider(scrapy.Spider):
name = "my_spider"
def __init__(self, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.target_url = self.crawler.settings.get('target_url')
self.start_urls = [self.target_url] if self.target_url else []
def parse(self, response):
# Логика парсинга
pass
Расширенные возможности и особенности работы с аргументами
Приоритет аргументов: командная строка vs. settings.py
Аргументы, переданные через командную строку, имеют более высокий приоритет, чем аргументы, определенные в settings.py.
Безопасность при передаче конфиденциальных данных (например, паролей)
Не рекомендуется передавать конфиденциальные данные (пароли, API-ключи) напрямую через командную строку. Лучше использовать переменные окружения или файлы конфигурации.
Обработка и валидация аргументов в spider’е
Рекомендуется валидировать аргументы внутри spider’а, чтобы избежать ошибок и неожиданного поведения. Можно использовать библиотеку cerberus или schema.
Заключение
Преимущества использования аргументов процесса обхода
- Гибкость: настройка spider’ов без изменения кода.
- Удобство: легкая адаптация к различным задачам.
- Конфигурация: передача различных настроек и параметров.
Рекомендации по организации и передаче аргументов
- Используйте
settings.pyдля общих настроек. - Передавайте аргументы через командную строку для специфических задач.
- Валидируйте аргументы внутри spider’а.
- Избегайте передачи конфиденциальных данных напрямую.