Scrapy爬虫ImagePipeLine的自定义扩展

Scrapy框架提供了ImagePipeLine管道,用于下载网页中的图片,存储到本地或者云

框架提供的默认管道功能是,在Spider中收集图片url,作为列表存储到Item的指定属性image_urls中去,管道自动会下载图片并且可以存储完整图像和缩略图到指定的存储位置,图片名称为url的hash

这里主要有一个问题,图片如果要分类、分详情存储,比如一个详情页面的图片放到一个文件夹中,这样的要求旧需要定制ImagePipeLine

 

1.图片存储Item

import scrapy


# 地产图片实体
class Image(scrapy.Item):
    # 地产编号
    no = scrapy.Field()
    # 地产类型
    classify = scrapy.Field()
    # 图片url
    image_urls = scrapy.Field()

主要字段为image_urls,这个属性存储了图片url列表,属性名称可以配置,其他属性是为了生成存储目录

 

2.自定义ImagePipeLine

import os
import scrapy

from urllib.parse import urlparse

from image import Image
from scrapy.pipelines.images import ImagesPipeline

#图片管道
class MyImagesPipeline(ImagesPipeline):
    
    def get_media_requests(self, item, info):
        #只处理Info
        if isinstance(item, Image):
            classify = item.get('classify')
            no = item.get('no')
            for url in item.get(self.images_urls_field, []):
                print(url)
                name = classify+"/"+no+"/"
                yield scrapy.Request(url=url, meta={'name':name})

    def file_path(self, request, response=None, info=None):
        #文件路径 images/<类别>/<编号>/<文件名>
        return 'images/' + request.meta['name']+request.url.split('/')[-1].split('?')[0]

重写get_media_requests方法,首先判断了Item的类型,然后获取url,遍历发出请求,设置元数据name用于构造目录路径

重写file_path方法·,这个方法直接返回相对目录路径,其中拼接了元数据中的路径,起到了分开存储的目的

你可能感兴趣的:(python,scrapy,python)