Scrapy crawl с параметром: Как настроить запуск с аргументами?

Зачем передавать параметры в Scrapy Crawl?

Передача параметров в Scrapy crawl позволяет сделать ваши пауки более гибкими и настраиваемыми. Это особенно полезно, когда необходимо:

  • Изменять поведение паука без изменения его кода.
  • Запускать паука для разных сайтов или разделов сайта.
  • Контролировать глубину парсинга или количество обрабатываемых страниц.
  • Передавать параметры аутентификации или API-ключи.

Основные способы передачи аргументов в Scrapy

Существует несколько основных способов передачи аргументов в Scrapy crawl:

  1. Через командную строку: самый простой и быстрый способ передачи небольшого количества параметров.
  2. Через Settings: позволяет более структурированно передавать параметры, особенно когда их много или они должны быть доступны в разных частях проекта.
  3. Через Custom Runners: предоставляет максимальную гибкость и контроль над процессом запуска crawl, но требует написания дополнительного кода.

Передача параметров через командную строку

Определение аргументов в Spider-е

Чтобы паук мог принимать аргументы, их необходимо определить в его классе. Аргументы передаются как атрибуты экземпляра паука.

import scrapy

class MySpider(scrapy.Spider):
    name = "myspider"
    start_urls = []

    def __init__(self, url: str = None, pages: int = 1, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.start_urls = [url] if url else []
        self.pages_to_crawl = int(pages)

    def parse(self, response):
        # Логика парсинга страниц
        yield {
            'url': response.url,
            'page_number': self.pages_to_crawl  # Пример использования параметра
        }

Запуск Scrapy crawl с аргументами: синтаксис

Для запуска crawl с аргументами используется следующий синтаксис в командной строке:

scrapy crawl <spider_name> -a <argument_name>=<argument_value>

Пример: передача URL и количества страниц для парсинга

Предположим, нам нужно спарсить сайт example.com и ограничить количество страниц для парсинга до 5. Тогда команда будет выглядеть так:

scrapy crawl myspider -a url=https://example.com -a pages=5

Использование Settings для передачи параметров

Преимущества использования Settings

Использование Settings имеет ряд преимуществ:

  • Централизованное управление параметрами: все параметры хранятся в одном месте.
  • Удобство доступа: параметры доступны в любом месте проекта.
  • Возможность переопределения: параметры можно переопределять при запуске crawl.

Определение Settings в файле settings.py

В файле settings.py определяются параметры проекта. Например:

# settings.py

MY_CUSTOM_SETTING = 'default_value'

Получение Settings внутри Spider-а

Внутри паука Settings можно получить через объект crawler.settings:

Реклама
import scrapy
from scrapy.crawler import CrawlerProcess

class MySpider(scrapy.Spider):
    name = "myspider_settings"
    start_urls = ["http://example.com"]

    def __init__(self, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.custom_setting = self.crawler.settings.get('MY_CUSTOM_SETTING')

    def parse(self, response):
        yield {
            'setting_value': self.custom_setting,
            'url': response.url
        }

Передача параметров через Settings при запуске crawl

Параметры можно передавать через Settings при запуске crawl с помощью ключа -s или --set:

scrapy crawl myspider_settings -s MY_CUSTOM_SETTING='new_value'

Передача параметров через Custom Runners

Создание Custom Runner

Custom Runner позволяет полностью контролировать процесс запуска Scrapy. Для его создания необходимо создать скрипт, который будет запускать CrawlerProcess.

# runner.py
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.settings import Settings
from your_project.spiders.myspider import MySpider # Replace with your spider


def run_spider(url: str, pages: int):
    process = CrawlerProcess(settings={
        'MY_URL': url,
        'MY_PAGES': pages
    })

    process.crawl(MySpider)
    process.start()

if __name__ == '__main__':
    run_spider(url='https://example.com', pages=10)

Интеграция параметров в Custom Runner

В Custom Runner параметры можно передавать непосредственно в Settings или в конструктор паука.

Запуск Scrapy с Custom Runner и параметрами

Запуск осуществляется простым запуском Python скрипта:

python runner.py

Обработка и проверка переданных параметров

Валидация аргументов: проверка типов и значений

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

class MySpider(scrapy.Spider):
    name = "myspider_validation"

    def __init__(self, url: str = None, pages: int = 1, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        try:
            self.pages_to_crawl = int(pages)
            if self.pages_to_crawl <= 0:
                raise ValueError("Number of pages must be positive")
        except ValueError as e:
            raise ValueError(f"Invalid value for pages: {e}")

        self.start_urls = [url] if url else []

Обработка ошибок при передаче некорректных параметров

Необходимо предусмотреть обработку ошибок, связанных с некорректными параметрами. Это может быть вывод сообщения об ошибке или завершение работы паука.

Использование argparse для сложной обработки аргументов

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

import argparse

parser = argparse.ArgumentParser(description='Scrapy spider runner')
parser.add_argument('--url', type=str, help='The URL to crawl')
parser.add_argument('--pages', type=int, default=1, help='Number of pages to crawl')

args = parser.parse_args()

# Access arguments using args.url and args.pages

Добавить комментарий