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对象,但它永远不会被下载,这是为什么?
因为 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 的值不包含在该迭代中。我希望这个例子能帮助你。
回调中的
yield
使回调可以作为迭代器工作。
您必须使用
yield
,或返回一个列表。您不能将两者结合起来。
我发现此链接很有帮助:https://www.reddit.com/r/scrapy/comments/8w85yl/extracted_item_return_vs_yield/
最终的区别取决于您是运行一个 Scrapy 实例、运行一个 Spider,还是运行一组由共享边界支持的 Scrapy Spider。对于前者,这没有任何区别。但在后者中,它将您的爬行从串行爬行更改为稍微并行的爬行,因为其他蜘蛛可以开始执行由任何兄弟蜘蛛生成的请求甚至项目,而无需等待第一个蜘蛛在开始之前运行整个爬行下一步。