允许使用Scrapy Image Pipeline重复下载?

时间:2017-07-18 21:24:23

标签: python scrapy pipeline

请参阅下面的代码示例版本,该代码使用Scrapy Image Pipeline从网站下载/抓取图像:

import scrapy
from scrapy_splash import SplashRequest
from imageExtract.items import ImageextractItem

class ExtractSpider(scrapy.Spider):
    name = 'extract'
    start_urls = ['url']

    def parse(self, response):
        image = ImageextractItem()
        titles = ['a', 'b', 'c', 'd', 'e', 'f']
        rel = ['url1', 'url2', 'url3', 'url4', 'url5', 'url6']

        image['title'] = titles
        image['image_urls'] = rel
        return image

一切正常,但根据默认设置,避免下载重复项。有没有办法覆盖这个,以便我也可以下载重复项?感谢。

3 个答案:

答案 0 :(得分:1)

感谢Tomáš的指示,最终我找到了下载重复图像的方法。

_process_request课程的MediaPipeline中,我会对这些行进行评论。

# Return cached result if request was already seen # if fp in info.downloaded: # return defer_result(info.downloaded[fp]).addCallbacks(cb, eb)

# Check if request is downloading right now to avoid doing it twice # if fp in info.downloading: # return wad

会发生未捕获的KeyError,但它似乎不会影响我的结果,所以我停止了进一步挖掘。

答案 1 :(得分:0)

我认为一种可能的解决方案是使用重写方法scrapy.pipelines.images.ImagesPipeline创建自己继承自get_media_requests的图像管道(例如,请参阅documentation)。在产生scrapy.Request的同时,将dont_filter=True传递给构造函数。

答案 2 :(得分:0)

要克服Rick提到的KeyError,我所做的是:

也在类_cache_result_and_execute_waiters中查找函数MediaPipeline,如果情况如下所示,您将看到类似的情况

if isinstance(result, Failure):
   # minimize cached information for failure 
   result.cleanFailure()
   result.frames = []
   result.stack = None

我添加了另一个if case来检查fp是否在info.waiting中,之后的所有内容都放在此case中

if fp in info.waiting:
    info.downloading.remove(fp)  
    info.downloaded[fp] = result  # cache result
    for wad in info.waiting.pop(fp):
        defer_result(result).chainDeferred(wad)

在调试日志中,您的scrapy Item的"images"中的路径名仍然不正确。但是我通过为所有"image_urls"

创建图像名称列表来将其保存在正确的路径中