使用 yield 将变量赋予回调函数

Give variable to callback function with yield

在 Scrapy 中

我一开始有两个函数 parse() 被调用,parse_each()parse()

中被调用
class UtamapSpider(scrapy.Spider):
    def parse(self, response):
        yield scrapy.Request(url=each_url, callback=self.parse_each)

    def parse_each(self,response):

现在,我想将一些附加参数传递给 parse_each。 所以,我想做的就是这样。

class UtamapSpider(scrapy.Spider):
    def parse(self, response):
        yield scrapy.Request(url=each_url, callback=self.parse_each(99)) #example pass value `99`

    def parse_each(self,response,myvalue):
        print(myvalue) # 99 

恐怕不可能,但是有什么好的方法可以将附加数据传递给回调函数吗??

规范的方法是使用 lambda

callback=lambda response:self.parse_each(response, 99)

您可以使用 Request class 的 cb_kwargs 参数,如下所示。

class UtamapSpider(scrapy.Spider):
    def parse(self, response):
        yield scrapy.Request(url=each_url, cb_kwargs={“myvalue”: 99}, callback=self.parse_each) #example pass value `99`

    def parse_each(self,response,myvalue):
        print(myvalue) # 99


在子请求和解析函数之间共享值的正确方法是将此传递到请求对象的 meta 属性中,该对象接受将被复制到要创建的响应对象的字典。例如:

class UtamapSpider(scrapy.Spider):

    def parse(self, response):
        yield scrapy.Request(url=each_url, callback=self.parse_each, meta={'myvalue': 99})

    def parse_each(self,response,myvalue):
        print(response.meta['myvalue'])) # 99 

来自文档:

meta (dict) – the initial values for the Request.meta attribute. If given, the dict passed in this parameter will be shallow copied.

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

的更多信息