2017-07-18 4 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

オーバーフローメソッドget_media_requests(たとえばdocumentationを参照)を使用してscrapy.pipelines.images.ImagesPipelineから継承した独自のイメージパイプラインを作成することが考えられます。 scrapy.Requestを生成している間に、コンストラクタにdont_filter=Trueを渡します。

+0

ありがとう、私はこれを試して、それは動作するように見えませんでした。私は、画像パイプラインのソース自体にいくつかの「重複検出コード」が存在する可能性があると考えていますが、コードを見直すことで、どこでも見つけることができません。私がそれを見つけることができれば、私はそれを更新して、これをスキップするカスタム引数で渡すことができるかもしれません。 –

+1

私はそれを見つけたと思います。クラス 'MediaPipeline'のメソッド' _process_request'を見てください([link](https://github.com/scrapy/scrapy/blob/master/scrapy/pipelines/media.py) ))。すでにダウンロードされている場合は、キャッシュからファイルを取得します(要求指紋に基づいて)。残念ながら、引数や設定でカスタマイズする方法はありません。 –

+0

ありがとうございます!コメントを出したり、ソースのいくつかを調整したり、自分のアプリケーションでうまく動作するようにする方法が見つかるかどうかを確認します。 –

1

Tomášの指示のおかげで、結局は重複した画像をダウンロードする方法が見つかりました。

_process_requestのクラスMediaPipelineでは、これらの行についてコメントします。 uncatched KeyError例外が発生する

# 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

が、私がさらに掘り停止して、私の結果には影響を与えないようです。

関連する問題