Паук Python Scrapy: передать дополнительную информацию в методе parse () для каждого start_url - PullRequest
1 голос
/ 19 октября 2019

Я пишу паук-скрап, в котором я хотел бы передать дополнительную информацию в методе parse() для каждого start_url.

Я создал карту из списка start_urls в additional_dataи я использую эту карту внутри метода.

class ExampleSpider(scrapy.Spider):
    name = 'example'
    allowed_domains = ['alldomain.com']
    start_urls = ['http://a.com/', 'http://b.com/', 'http://c.com/']
    additional_data = [x,y,z]
    dict_map = dict(zip(start_urls, additional_data))

    def parse(self, response):
        url_first_additional_data = dict_map[response.url]
        # do other processing

Есть ли какой-либо другой лучший способ сделать то же самое, я не уверен, будет ли в response.url также URL-адрес запроса, и карта можеткушать много памяти, если у меня огромные дополнительные_данные?

1 Ответ

2 голосов
/ 20 октября 2019

Если вы хотите передать дополнительные аргументы в функцию разбора, вы можете сделать это, переопределив метод запросов на запуск по умолчанию. Вы должны переименовать ваш start_urls в вашем методе init на что-то другое, если вы хотите использовать метод start_requests, поскольку я переименовываю его в starting_urls

def start_requests(self):
    for url in self.starting_urls:
        yield Request(
            url,
            cb_kwargs={'additional_argument': dict_map[url]}
        )

def parse(self, response, additional_argument):
    # Here you can use that additional_argument
    pass

Также для получения URL-адреса в синтаксическом анализе, ResponseОбъект также содержит оригинальный объект запроса. Таким образом, вы можете получить URL запроса по response.request.url

def parse(self, response):
    additional_argument = self.dict_map[response.request.url]

Обратите внимание, что я переименовываю start_url в start_urls

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...