1

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

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

我想做完全相反的事情:首先刮掉所有 HTML url,然后一次下载所有媒体文件。我怎样才能做到这一点?

4

1 回答 1

2

不是答案,但如果您想知道这种行为是如何实现的,请检查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
于 2016-04-22T17:19:24.270 回答