2017-07-18 73 views
0

请参阅下面的我的代码,它使用Scrapy图像流水线从网站下载/刮图片实例版本:允许使用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 

这一切工作正常,但按照默认设置,避免了重复下载。有什么方法可以覆盖这个,这样我就可以下载重复的东西了吗?谢谢。

回答

0

我认为一个可能的解决方案是创建scrapy.pipelines.images.ImagesPipeline继承与重写的方法get_media_requests自己的形象管道(见documentation为例)。在产生scrapy.Request的同时,将dont_filter=True传递给构造函数。

+0

谢谢,我试过了,它似乎没有工作。我怀疑图像管道源本身可能存在一些“重复检测代码” - 但从审查代码,我似乎无法在任何地方找到它。如果我能找到它,我可以更新它,这样我就可以通过自定义arg来跳过这一步。 –

+1

我想我已经找到了它,看看'MediaPipeline'类的方法'_process_request'([link](https://github.com/scrapy/scrapy/blob/master/scrapy/pipelines/media.py ))。如果已经下载(基于请求指纹),它将从缓存中取得文件。不幸的是,似乎没有办法用任何参数或设置来定制它。 –

+0

谢谢!我会尝试评论/调整一些源代码,看看我能否找到一种方法使其适用于我的应用程序。 –

1

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

在类MediaPipeline_process_request,我评论这些行。

# 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

会出现一个uncatched KeyError异常,但似乎没有影响我的结果,所以我停止了进一步挖掘。