Python的yield和return语句?以及Scrapy的请求输出
什么是 yield
和 return
的区别?请用例子解释一下。
在生成器中,当我们 yield
一个值或者请求时,实际上发生了什么?
我并没有从其他函数或程序调用我的生成器。
我的循环是:
for index in range(3):
yield Request(url,callback=parse)
这段代码是在特定的 URL 上发起请求,并在请求完成后调用回调函数。这段代码到底在做什么呢?
代码的执行顺序是怎样的?
2 个回答
1
你提问中唯一没有被@Jochen链接的问题回答的部分是“我没有从其他函数或程序调用我的生成器。”
你定义了你的爬虫类,然后Scrapy会根据文档中说明的内容调用你定义的(特殊)函数。(比如,parse
函数是默认的回调函数,用于那些没有指定回调的请求)。
2
我想你在使用 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 的文档,特别是关于 爬虫 的部分,发现有个叫 start_requests()
的函数时,它提到这个方法必须返回一个可迭代的东西。如果你把 yield
改成 return
,那就不再是可迭代的了,因为当你启动爬虫时,for 循环已经结束了,这样就会搞得一团糟。
其实,你的爬虫应该一个一个地发送 HTTP 请求,所以最好的方法就是用生成器。在 for 循环中,你的爬虫会在 yield
的地方停下来,返回 scrapy.Request()
。一切完成后,你的爬虫会 send()
给生成器,然后继续处理列表中的下一个 URL。