【问题标题】:Scrapy callback return vs yieldScrapy 回调返回与收益
【发布时间】:2020-09-16 20:24:37
【问题描述】:
def parse_pagelist(self,response):
        for page in pageinfo:
            page_url=page['url']
            yield response.follow(page_url,self.parse_page)
        next_page=response.xpath('//ol[@class="page-main"]/li[last()]/a/@href').get()
        if next_page:
            return [response.follow(next_page,callback=self.parse_pagelist)]

在关于 spider.parse 的 scrapy 文档中它说:

此方法以及任何其他 Request 回调必须返回 >Request 和/或 item 对象的可迭代对象。

这里我返回一个 list 对象包含scrapy.Request,但它永远无法下载,这是为什么呢?

【问题讨论】:

    标签: web-scraping scrapy


    【解决方案1】:

    因为 return 会向其调用者返回一个特定的值,并且您的函数将在一个 return 之后停止,而 yield 会产生一系列值只有当没有更多的值可以产生时,它才会停止函数。

    您可能想了解生成器here

    编辑: 以下是可以说明问题的示例:

    def generate():
        for i in range(5):
            yield i
        return 15
    result = [i for i in generate()]
    

    result 变量的值将是[0, 1, 2, 3, 4]

    Generators 使用__next__ 方法从下一次迭代中获取值,并且 returned 的值不包含在该迭代中。我希望这个例子对你有所帮助。

    【讨论】:

    • 我知道return和yield的区别。问题是为什么parse_pagelist的endresponse.follow中的callback函数没有如果我 return 就执行,如果我 yield 它就会执行
    • 如果您尝试创建一个函数来产生一些数字并在最后返回一个特定的数字,那么最后一个 返回ed 的数字将不会被迭代。我在答案中添加了一个示例。
    • 我编辑了我的问题,感谢您的帮助和帮助,但请在回答之前尝试理解问题。
    【解决方案2】:

    回调中的yield 使您的回调作为迭代器工作。

    您必须要么使用yield,要么返回一个列表。你不能同时结合两者。

    【讨论】:

    • 但是return语句在我的回调结束时,所有的yield都已经执行了,为什么return a list在这里不起作用?
    猜你喜欢
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2010-12-01
    • 2014-08-29
    • 2020-04-21
    • 2013-12-11
    • 2019-06-20
    相关资源
    最近更新 更多