2017-07-18 64 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異常,但似乎沒有影響我的結果,所以我停止了進一步挖掘。