我正在查阅图书馆的资料。我的问题是一般性的,不是针对图书馆的。我想知道的代码是这样的:
class SpiderMiddlewareManager(MiddlewareManager):
# ...
def process_start_requests(self, start_requests, spider):
return self._process_chain('process_start_requests', start_requests, spider)
class
# ...
def open_spider(self, spider, start_requests=(), close_if_idle=True):
# ...
start_requests = yield self.scraper.spidermw.process_start_requests(start_requests, spider)
# ...
我的问题是:start_requests = yield self.scraper.spidermw.process_start_requests(...)
与start_requests = self.scraper.spidermw.process_start_requests(...)
有何不同,因为self.scraper.spidermw.process_start_requests
已经返回了一个值。如果我的理解是正确的,open_spider
不是一个生成器。在
谢谢
你的问题中遗漏了一个重要的细节——你所看到的库是写在^{} 之上的,这是一个异步网络框架。完整的方法声明实际上如下所示:
^{} 修饰符对使用
yield
的所有调用执行一些魔术。本质上,它允许您编写通常使用回调的异步代码,其方式是看起来是同步的:如果深入研究
^{pr2}$process_start_requests
调用,您会发现它最终调用scrapy.util.defer.process_chain
,它返回一个Deferred
:相关问题 更多 >
编程相关推荐