是否可以为每个单独的请求从start_requests()传递变量到parse()?

时间:2017-01-01 09:32:48

标签: scrapy

我使用循环在start_request()内生成请求,并且我希望将索引传递给parse(),以便将其存储在项目中。但是,当我使用self.i时,输出的每个项目都有i最大值(最后一个循环转弯)。我可以使用response.url.re('regex to extract the index'),但我想知道是否有一种干净的方法可以将变量从start_requests传递到解析。

2 个答案:

答案 0 :(得分:26)

您可以使用scrapy.Request meta属性:

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'

    def start_requests(self):
        urls = [...]
        for index, url in enumerate(urls):
            yield scrapy.Request(url, meta={'index':index})

    def parse(self, response):
        print(response.url)
        print(response.meta['index'])

答案 1 :(得分:3)

您可以将cb_kwargs参数传递给scrapy.Request()

https://docs.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Request.cb_kwargs

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'

    def start_requests(self):
        urls = [...]
        for index, url in enumerate(urls):
            yield scrapy.Request(url, callback=self.parse, cb_kwargs={'index':index})

    def parse(self, response, index):
        pass