http://doc.scrapy.org/en/latest/topics/media-pipeline.html
当项目到达FilesPipeline时,file_urls字段中的URL计划使用标准Scrapy调度程序和下载程序(这意味着重新使用调度程序和下载程序中间件)下载,但具有更高优先级,处理它们在其他页面被删除之前。该项目在该特定管道阶段保持“锁定”,直到文件完成下载(或由于某种原因失败)。
我想做的恰恰相反:先刮掉所有HTML网址,然后立即下载所有媒体文件。我怎么能这样做?
答案 0 :(得分:1)
不是答案,但如果您想知道如何实施此行为,请检查MediaPipeline
管道源代码,尤其是process_item
method:
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
子类生成的请求将立即发送下载by using crawler.engine.download
directly:
(...)
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