不是答案,但如果您想知道这种行为是如何实现的,请检查MediaPipeline
管道源代码,尤其是process_item
方法:
def process_item(self, item, spider):
info = self.spiderinfo
requests = arg_to_iter(self.get_media_requests(item, info))
dlist = [self._process_request(r, info) for r in requests]
dfd = DeferredList(dlist, consumeErrors=1)
return dfd.addCallback(self.item_completed, item, info)
您会看到一堆请求排队等待处理(发送的请求 + 下载的响应)item_completed
最终被调用,返回原始项目 + 下载的媒体信息。
在名义情况下,子类生成的请求将通过直接MediaPipeline
使用立即发送下载:crawler.engine.download
(...)
else:
request.meta['handle_httpstatus_all'] = True
dfd = self.crawler.engine.download(request, info.spider)
dfd.addCallbacks(
callback=self.media_downloaded, callbackArgs=(request, info),
errback=self.media_failed, errbackArgs=(request, info))
return dfd