关于用Python的Scrapy框架开发爬虫时如何保存图片的咨询

用 Scrapy 框架开发爬虫,按照一般的规范,对图片进行下载并保存的操作是不是应当放在 pipelines.py 中实现呢?
谢谢
关于用Python的Scrapy框架开发爬虫时如何保存图片的咨询

7 回复

在Scrapy里存图片,直接用内置的ImagesPipeline最省事。先在settings.py里配好:

ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 1,
}
IMAGES_STORE = './images'  # 存图片的目录

然后在items.py定义你的item,确保有个image_urls字段:

import scrapy

class MyItem(scrapy.Item):
    image_urls = scrapy.Field()
    images = scrapy.Field()

最后在spider里把图片链接塞进item就行:

import scrapy
from myproject.items import MyItem

class MySpider(scrapy.Spider):
    name = 'img_spider'
    
    def parse(self, response):
        item = MyItem()
        # 假设图片链接在img标签的src属性里
        item['image_urls'] = response.css('img::attr(src)').getall()
        yield item

跑起来后图片会自动下载到./images/full/目录下,文件名是图片URL的SHA1哈希值。如果想自定义文件名或加些处理,可以继承ImagesPipeline重写file_path方法:

from scrapy.pipelines.images import ImagesPipeline

class MyImagesPipeline(ImagesPipeline):
    def file_path(self, request, response=None, info=None, *, item=None):
        # 用item里的name字段当文件名
        return f"{item['name']}.jpg"

记得在settings里把默认的pipeline换成你这个自定义的。

总结:用ImagesPipeline最方便。

谢谢!

爬虫下载图片的做法,是不是最好用的还是 urllib 模块和以下的步骤?
req=urllib.request.Request(imageURL)
response=urllib.request.urlopen(req)
data=response.read()

谢谢,我去学习学习

请教,这个例子中的 get_media_requests(self,item,info)方法,info 参数是怎么个用法呢?谢谢

没什么用, 兼容旧版本的

回到顶部