Python yield和return语句?和Scrapy产生请求

时间:2012-01-08 18:16:42

标签: python scrapy

yieldreturn之间的区别是什么? 以及在生成器中我们yield任何值或请求时实际发生了什么?

我没有从任何其他功能或程序中调用我的生成器。

我的循环是:

for index in range(3):
  yield Request(url,callback=parse)

这是在特定URL上发出请求并在请求后调用回调函数。这段代码在做什么?

代码遵循的顺序是什么?

2 个答案:

答案 0 :(得分:1)

@Jochen链接的问题没有回答你问题的唯一方面是“我不是从任何其他函数或程序调用我的生成器。”。

您定义了爬虫类,scrapy调用您定义的(特殊)函数,如文档中所指定。 (例如,parse函数是未指定回调的请求的默认回调。)

答案 1 :(得分:0)

我猜您在函数yield中遇到了包含上下文def start_requests(self): urls = [ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) 的谜题。

例如:

start_requests()

当您引用scrapy spider文档然后找到名为yield的函数时,它表示该方法必须返回一个iterable。如果你将yield更改为return,那么它不是可迭代的,因为当你启动你的蜘蛛时for循环已经结束了。它可能是一团糟。

蜘蛛应该逐个向这些目的地发送http请求是很自然的,所以最好的方法是生成器。在for循环中,您的蜘蛛将停在scrapy.Request()并返回send(),完成所有操作后,您的蜘蛛将{{1}}生成并生成下一个 跟随列表中的网址。