Scrapy:图片管道,下载图片

6

根据scrapy教程,我制作了一个简单的图片爬虫(用于爬取布加迪汽车的图片)。示例见下:EXAMPLE

然而,跟随指南却导致我的爬虫无法运行!它找到所有网址,但不下载图片。

我找到了一个临时解决方案:将ITEM_PIPELINESIMAGES_STORE替换为以下内容:

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

IMAGES_STORE -> FILES_STORE

但是我不知道为什么会起作用?我想使用文档中记录的ImagePipeline。

EXAMPLE

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])

1
请问您能否发布__main__桩代码?我们如何调用这些函数? - Nathan majicvr.com
1
main 是标准的 Scrapy 代码,是一个样板文件。它会调用这段代码中的蜘蛛程序。我同意这段代码还不完整,但我们可以推测其他组成部分的样子。 - Supreet Sethi
2个回答

15
你的爬虫返回的项必须包含字段"file_urls",用于文件和/或"image_urls",用于图像。在你的代码中,你指定了图片管道的设置,但是你返回的URL在"file_urls"中。
只需更改此行:
yield ImageItem(file_urls=[img_url])
# to
yield {'image_urls': [img_url]}

*Scrapy可以返回字典对象,而不是条目对象,这在只有一两个字段时能节省时间。


2
谢谢!您也可以将“ImageItem”更改为具有“image_urls”,并且“yield ImageItem(image_urls=[img_url])”。 - Alexander R Johansen

7

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

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

安装了Pillow之后,它正常工作。


哇,我希望在抓取输出中更加明显一点 - 静默的失败令人惊讶。文档在这里。谢谢分享! - purpleladydragons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接