【问题标题】:Python yield and return statements? and Scrapy Yielding the requestsPython yield 和 return 语句?和 Scrapy 产生请求
【发布时间】:2012-01-08 18:16:42
【问题描述】:

yield 和return 有什么区别,请举例说明? 当我们在生成器中yield 任何值或请求时,实际会发生什么?

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

我的循环是:

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

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

代码后面的顺序是什么?

【问题讨论】:

标签: python scrapy


【解决方案1】:

我猜你在函数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()的函数时,它说该方法必须返回一个iterable。如果您将 yield 更改为 return,则它不是可迭代的,因为当您启动蜘蛛时 for 循环已经结束。这可能是一团糟。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2015-05-02
      • 2016-04-08
      • 2017-08-30
      • 2014-10-07
      • 2018-01-01
      • 1970-01-01
      相关资源
      最近更新 更多