龙行博客

走路看风景,经历看人生,岁月留痕迹,人生留轨迹,17的历史,18的豪情,时间的匆忙,人生的风景,放开心胸往前走,成功再远行,放开理想往前走,梦想再行动。
现在位置:首页 > 编程语言 > Python > scrapy 图片下载(二):scrapy图片重命名、放入不同文件夹

scrapy 图片下载(二):scrapy图片重命名、放入不同文件夹

龙行    Python    2019-8-27    2402    0评论    


小伙伴,欢迎回来,一起学习scrapy!可能有些朋友使用scrapy下载图片,并不满足简单下载,还需要重命名,还需要图片归类(把同一url里的图片放入同一文件夹)。那scrapy图片下再要如何处理?其实横简单,如果你看了我们继承的scrapy类:ImagesPipeline的一些实现,你会发现里面有这么一个方法:def file_path(self, request, response=None, info=None) 这个方法便是图片重命名以及目录归类的方法,我们只需要重写里面的一些内容,便可轻松实现scrapy图片重命名,图片保存不同目录。核心代码如下:

    # 重命名,若不重写这函数,图片名为哈希,就是一串乱七八糟的名字
    def file_path(self, request, response=None, info=None):

        # 提取url前面名称作为图片名。
        image_guid = request.url.split('/')[-1]
        # 接收上面meta传递过来的图片名称
        name = request.meta['name']
        # 过滤windows字符串,不经过这么一个步骤,你会发现有乱码或无法下载
        name = re.sub(r'[?\\*|“<>:/]', '', name)
        # 分文件夹存储的关键:{0}对应着name;{1}对应着image_guid
        filename = u'{0}/{1}'.format(name, image_guid)
        return filename
        http://lab.scrapyd.cn/archives/55.html


每一个页面所有图片分别放入此页面标题所命名文件夹内,图片名截取图片url后缀前面一个字符,如下图:

scrapy图片下载

好了,接下来开始!

一、创建项目

scrapy startproject ImagesRename

二、编写item

import scrapy


class ImagesrenameItem(scrapy.Item):
    # define the fields for your item here like:
    imgurl = scrapy.Field()
    imgname = scrapy.Field()
    pass

三、spiders目录下创建蜘蛛文件:ImgsRename.py编写相应蜘蛛

import scrapy
from ImagesRename.items import ImagesrenameItem

class ImgsrenameSpider(scrapy.Spider):
    name = 'ImgsRename'
    allowed_domains = ['lab.scrapyd.cn']
    start_urls = ['http://lab.scrapyd.cn/archives/55.html',
                  'http://lab.scrapyd.cn/archives/57.html',
                  ]

    def parse(self, response):
        # 实例化item
        item = ImagesrenameItem()
        # 注意imgurls是一个集合也就是多张图片
        item['imgurl'] = response.css(".post img::attr(src)").extract()
        # 抓取文章标题作为图集名称
        item['imgname'] = response.css(".post-title a::text").extract_first()
        yield item

四、编写pipeline

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

class ImagesrenamePipeline(ImagesPipeline):

    def get_media_requests(self, item, info):
        # 循环每一张图片地址下载,若传过来的不是集合则无需循环直接yield
        for image_url in item['imgurl']:
            # meta里面的数据是从spider获取,然后通过meta传递给下面方法:file_path
            yield Request(image_url,meta={'name':item['imgname']})

    # 重命名,若不重写这函数,图片名为哈希,就是一串乱七八糟的名字
    def file_path(self, request, response=None, info=None):

        # 提取url前面名称作为图片名。
        image_guid = request.url.split('/')[-1]
        # 接收上面meta传递过来的图片名称
        name = request.meta['name']
        # 过滤windows字符串,不经过这么一个步骤,你会发现有乱码或无法下载
        name = re.sub(r'[?\\*|“<>:/]', '', name)
        # 分文件夹存储的关键:{0}对应着name;{1}对应着image_guid
        filename = u'{0}/{1}'.format(name, image_guid)
        return filename

五、设置

ITEM_PIPELINES = {
   'ImagesRename.pipelines.ImagesrenamePipeline': 300,
}

# 设置图片存储目录
IMAGES_STORE = 'D:\ImagesRename'

六、运行

scrapy crawl ImgsRename

经过上面步骤,你会发现我们已经成功下载所有图片,并且分类保存在不同目录,且都按我们要求重命名好了,如下图:

scrapy图片下载

转载自: scrapy中文网

评论一下 分享本文 赞助站长

赞助站长X

扫码赞助站长
联系站长
龙行博客
  • 版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《龙行博客》。
  • 本文网址:https://www.liaotaoo.cn/285.html
  • 上篇文章:scrapy拼接url
  • 下篇文章:scrapy 图片下载(一):三行代码实现scrapy图片下载
  • python3 scrapy
快捷导航
联系博主
在线壁纸
给我留言
四四五五
音乐欣赏
返回顶部