Scrapy:更改媒体管道下载优先级:如何在爬网结束时延迟媒体文件下载?

时间:2016-04-22 16:22:27

标签: scrapy scrapy-spider scrapy-pipeline

http://doc.scrapy.org/en/latest/topics/media-pipeline.html

  

当项目到达FilesPipeline时,file_urls字段中的URL计划使用标准Scrapy调度程序和下载程序(这意味着重新使用调度程序和下载程序中间件)下载,但具有更高优先级,处理它们在其他页面被删除之前。该项目在该特定管道阶段保持“锁定”,直到文件完成下载(或由于某种原因失败)。

我想做的恰恰相反:先刮掉所有HTML网址,然后立即下载所有媒体文件。我怎么能这样做?

1 个答案:

答案 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