2016-07-26 11 views
2

以下:scrapy'sチュートリアル私は簡単な画像クローラを作成しました(Bugattisの画像をスクラップします)。これは、の例に示されています。Scrapy:画像パイプライン、画像をダウンロード

しかし、ガイドに従えば、機能していないクローラが私に残されました。それはすべてのURLを見つけますが、イメージをダウンロードしません。

私はダックテープソリューションを見つけました。ITEM_PIPELINESIMAGES_STOREを次のように置き換えてください。

ITEM_PIPELINES['scrapy.pipeline.images.FilesPipeline'] = 1

IMAGES_STORE - >FILES_STORE

しかし、これは動作しますなぜ私は知らないのですか?私は、Scrapによって文書化されたImagePipelineを使用したいと思います。

settings.py

BOT_NAME = 'imagespider' 
SPIDER_MODULES = ['imagespider.spiders'] 
NEWSPIDER_MODULE = 'imagespider.spiders' 
ITEM_PIPELINES = { 
    'scrapy.pipelines.images.ImagesPipeline': 1, 
} 
IMAGES_STORE = "/home/user/Desktop/imagespider/output" 

items.py

import scrapy 

class ImageItem(scrapy.Item): 
    file_urls = scrapy.Field() 
    files = scrapy.Field() 

imagespider.py

from imagespider.items import ImageItem 
import scrapy 


class ImageSpider(scrapy.Spider): 
    name = "imagespider" 

    start_urls = (
     "https://www.find.com/search=bugatti+veyron", 
    ) 

    def parse(self, response): 
     for elem in response.xpath("//img"): 
      img_url = elem.xpath("@src").extract_first() 
      yield ImageItem(file_urls=[img_url]) 

答えて

5

項目あなたのクモのリターンはフィールドファイル用"file_urls"および/またはイメージの"image_urls"が含まれていなければなりません。あなたのコードでは、イメージパイプラインの設定を指定しますが、返信URLは"file_urls"です。あなたが1つのまたは2つのフィールドを持っている場合

yield ImageItem(file_urls=[img_url]) 
# to 
yield {'image_urls': [img_url]} 

* scrapyではなく、項目の辞書オブジェクトを返すことができ、時間を節約できます:

は、単純にこの行を変更します。

+1

ありがとうございました! 'ImageItem'を' image_urls'と 'yield ImageItem(image_urls = [img_url])'に変更することもできます –

関連する問題