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

问题描述:

yieldreturn之间的区别是什么? 和实际发生什么时,我们yield生成器中的任何值或请求?Python的yield和return语句?和Scrapy产生请求

我不是从任何其他函数或程序调用我的生成器。

我的循环是:

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

这使得在特定的URL请求,调用请求后回调函数。这段代码在做什么?

代码的后续顺序是什么?

+1

可能出现[Python yield关键字解释]重复(http://*.com/questions/231767/the-python-yield-keyword-explained) – 2012-01-08 18:40:02

+2

不,但它的更详细和相关的一些例子对于SCRAPY请求对象。 – Clayton 2012-01-08 18:48:46

+0

你读过这个问题吗? – 2012-01-08 21:52:00

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

您可以定义您的搜寻器类,scrapy调用您定义的(特殊)函数,如文档中所述。 (例如,parse函数是未指定回调的请求的默认回调)。

我想你正面临着函数start_requests()中的谜题,其中的上下文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) 

当你指的scrapy spider的文档,然后找到函数命名start_requests(),它说的方法必须返回一个可迭代。如果你改变yield来返回,它不是可迭代的,因为当你启动你的蜘蛛时,for循环已经结束。它可能是一团糟。

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