Python的yield和return语句?以及Scrapy的请求输出

7 投票
2 回答
16190 浏览
提问于 2025-04-17 09:48

什么是 yieldreturn 的区别?请用例子解释一下。

在生成器中,当我们 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。

撰写回答