Scrapy:图像管道,下载图像

时间:2016-07-26 11:53:49

标签: python scrapy scrapy-spider scraper

以下:scrapy's教程我制作了一个简单的图像抓取工具(刮掉了Bugattis的图像)。以下示例中说明了这一点。

然而,按照指南给我留下了一个无法正常运行的爬虫!它找到所有网址,但不下载图片。

我找到了一个鸭子胶带解决方案:替换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])

2 个答案:

答案 0 :(得分:7)

您的蜘蛛返回的项目必须包含文件的字段"file_urls"和/或图片的"image_urls"。在您的代码中,您可以指定图片管道的设置,但在"file_urls"中指定返回网址。

只需更改此行:

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

* scrapy可以返回字典对象而不是项目,这样可以节省您只有一个或两个字段的时间。

答案 1 :(得分:0)

花了几个小时调查为什么内置的 ImagePipeline 在我的本地不起作用。 最后,我从文档中找到了这个

The Images Pipeline requires Pillow 4.0.0 or greater. It is used for thumbnailing and normalizing images to JPEG/RGB format.

安装 Pillow 后。运行正常。