python scrapy spider:在每个start_url

时间:2019-10-19 18:52:24

标签: python web-scraping scrapy

我正在写一个拼凑的蜘蛛,我想用parse()方法为每个start_url传递其他信息。

我已经创建了一个从列表start_urlsadditional_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,如果我拥有大量的Additional_data,地图是否会占用很多内存?

1 个答案:

答案 0 :(得分:2)

如果要传递其他参数来解析函数,则可以通过重写默认的启动请求方法来实现。如果要使用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

Response对象还用于获取解析中的url,其中也包含原始的request对象。因此,您可以通过response.request.url

获取请求网址
def parse(self, response):
    additional_argument = self.dict_map[response.request.url]

请注意,我正在将start_url重命名为start_urls