Scrapy回调返回与yield

问题描述 投票:0回答:3
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 对象的可迭代对象。

这里我返回一个包含scrapy.Request的list对象,但它永远不会被下载,这是为什么?

web-scraping scrapy
3个回答
1
投票

因为 return 向其调用者发送回一个特定的值,并且您的函数将在一次 return 后停止,而 yield 会生成一系列值,并且仅当没有更多值可产生时才会停止该函数。

您可能想在此处阅读有关生成器的信息。

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

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__
方法从下一次迭代中获取值,并且 return 的值不包含在该迭代中。我希望这个例子能帮助你。


0
投票

回调中的

yield
使回调可以作为迭代器工作。

您必须使用

yield
,或返回一个列表。您不能将两者结合起来。


0
投票

我发现此链接很有帮助:https://www.reddit.com/r/scrapy/comments/8w85yl/extracted_item_return_vs_yield/

最终的区别取决于您是运行一个 Scrapy 实例、运行一个 Spider,还是运行一组由共享边界支持的 Scrapy Spider。对于前者,这没有任何区别。但在后者中,它将您的爬行从串行爬行更改为稍微并行的爬行,因为其他蜘蛛可以开始执行由任何兄弟蜘蛛生成的请求甚至项目,而无需等待第一个蜘蛛在开始之前运行整个爬行下一步。

© www.soinside.com 2019 - 2024. All rights reserved.