Scrapy:图像管道,下载图像

Ale*_*sen 4 python scrapy scraper scrapy-spider

以下:scrapy的教程我做了一个简单的图像爬虫(刮掉Bugattis的图像).这在下面的实施例中说明.

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

我找到了一个鸭子胶带解决方案:替换ITEM_PIPELINES等等IMAGES_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"
Run Code Online (Sandbox Code Playgroud)

items.py

import scrapy

class ImageItem(scrapy.Item):
    file_urls = scrapy.Field()
    files = scrapy.Field()
Run Code Online (Sandbox Code Playgroud)

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])
Run Code Online (Sandbox Code Playgroud)

Gra*_*rus 11

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

只需更改此行:

yield ImageItem(file_urls=[img_url])
# to
yield {'image_urls': [img_url]}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!您还可以将`ImageItem` 更改为具有`image_urls` 和`yield ImageItem(image_urls=[img_url])` (2认同)

huy*_*nq9 7

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

The Images Pipeline requires Pillow 4.0.0 or greater. It is used for thumbnailing and normalizing images to JPEG/RGB format.
Run Code Online (Sandbox Code Playgroud)

安装好枕头后。它工作正常。