4. 保存图片文件

47 阅读1分钟

需要安装一个pillow的依赖 pip install pillow

跳过了spider的编写, 直接编写pipeline,假设已经获取到了文件url和文件名

pipeline

from scrapy.pipelines.images import ImagesPipeline
from scrapy import Request

# 需要继承ImagesPipeline
class TutorialPipeline(ImagesPipeline):
    # 获取一个Request,调用逻辑相当于默认的process_item
    def get_media_requests(self, item, spider):
        # 这里的url必须在spider中返回的字典中存在
        src = item['url']
        # 这里假设每个url都对应一个文件名, 可以通过meta属性传递
        yield Request(src, meta={'name': item['name']})

    # 完成路径的拼接, 需要返回字符串的文件路径
    def file_path(self, request, response=None, info=None, *, item=None):
        file_name = request.meta['name']
        return f"file/{file_name}"

    # 最后的收尾
    def item_completed(self, results, item, info):
        return item

这里的get_media_requests方法,实际实现的是MediaPipeline中的方法,他们的继承关系为 ImagesPipeline -> FilesPipeline -> MediaPipeline,具体的实现可以看MediaPipeline的process_item方法

file_path方法则是实现的ImagesPipeline中的方法,具体可以看ImagesPipeline中的get_images方法

编写完之后需要在setting文件中注册管道,然后添加下面的配置

IMAGES_STORE = "./images"

如果文件下载链接会先返回302重定向再下载的话,需要添加这个配置


# 如果下载图片时出现302重定向, 需要添加这个配置
MEDIA_ALLOW_REDIRECTS = True