首页 > 解决方案 > python scrapy spider:在 parse() 方法中为每个 start_url 传递附加信息

问题描述

我正在编写一个爬虫蜘蛛,我想在其中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,如果我有大量的附加数据,地图会占用大量内存吗?

标签: pythonweb-scrapingscrapy

解决方案


如果您想将其他参数传递给解析函数,您可以通过覆盖默认的启动请求方法来实现。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 对象中也有原始请求对象。所以你可以通过response.request.url

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

请注意,我将starting_url 重命名为start_urls


推荐阅读