Scrapy框架下载图片案例的改进版

说明

上一个案例,对自带的 ImagePipeline 写了一个图片下载案例,现在对最后的小结进行改进

  • 对图片进行进行自定义名称存储

    主要涉及 ImagePipeline类的继承与方法的重写

优化开始

优化 Wallpaperspider.py 文件

def parse(self, response):
    # 循环 li 标签 
    for urltag in response.xpath('//ul[@class="clearfix"]/li/a'):
        # 获取 图片标题
        titles = urltag.xpath('./img/@alt').get()
        # 获取 图片链接
        url = urltag.xpath('./img/@src').get() # --> 没有 http:// 的链接
        urls_pic = response.urljoin(url) # 拼接URL
        # 传给数据 Item 
        yield ImagesappItem(titles= titles, image_urls= urls_pic)

优化 pipeline.py 文件

继承 ImagePipeline 类

导入 ImagesPipeline 类

from scrapy.pipelines.images import ImagesPipeline

继承 ImagesPipeline 类

class PicImagesPipeline(ImagesPipeline):
    pass

重写 get_media_requests() 方法

此方法是构造请求的Ruquest对象

# 构造下载 ,首先调用的函数
def get_media_requests(self, item, info):
    # 导入 Request 模块
    from scrapy.http.request import Request
    # 在 item 中取出 url ,再把 item 给 meta参数进行传递
    # 在后面方法中,可以从 request对象的meta属性 获得 item 的数据
    yield Request(url=item['image_urls'],meta={'item':item})

重写 file_path() 方法

此方法是返回存储的路径

def file_path(self, request, response=None, info=None):
    # 从 request 对象的meta属性 获取 title
    title = request.meta['item']['titles']
    # 构造存储路径
    path = title +'.jpg'
    return path

修改 settings.py 文件

因为使用了自定义的 Pipeline,所以我们需要指定我们重写的 Pipeline

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'ImagesApp.pipelines.PicImagesPipeline':1, # 继承的重写 ImagesPipeline 类
}

运行爬虫

scrapy crawl WallPaperSpider

mark

发表评论 / Comment

用心评论~