2016-07-26 108 views
2

以下:scrapy's教程我做了一个简单的图像爬虫(擦除布加迪斯的图像)。下面在中举例说明示例Scrapy:图像管道,下载图像

但是,按照指南给我留下了一个不起作用的爬虫!它找到所有的网址,但它不下载图像。

我发现鸭胶带解决方案:取代ITEM_PIPELINESIMAGES_STORE这样的;

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

IMAGES_STORE - >FILES_STORE

但我不知道为什么这个工程?我想使用scrapy记录的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"图像。在您的代码中,您指定了图像管道的设置,但您的返回网址为"file_urls"

只需改变这一行:

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

* scrapy可以返回字典对象,而不是项目,从而节省了时间,当你只有一个或两个字段。

+1

谢谢!你也可以将'ImageItem'改成'image_urls'和'yield ImageItem(image_urls = [img_url])' –