1   前言

  Scrapy使用ImagesPipeline类中函数get_media_requests下载到图片后,默认的图片命名为图片下载链接的哈希值,例如:它的下载链接是http://img.ivsky.com/img/bizhi/pre/201101/10/harry_potter5-017.jpg,哈希值为7710759a8e3444c8d28ba81a4421ed,那么最终的图片下载到指定路径后名称为7710759a8e3444c8d28ba81a4421ed.JPG。想要自定义图片名称则需要借助ImagesPipeline类中item_completed()函数来重命名。

2   爬虫过程

  爬虫过程就不赘述了,链接请参看:https://www.cnblogs.com/mrtop/p/10180072.html,本文章重点介绍如何自定义图片名称。爬虫运行后获得的图片如下图:

  

3   自定义图片名称具体方法

3.1 自定义图片名称代码

 

import os
from harry.settings import IMAGES_STORE as IMGS
from scrapy.pipelines.images import ImagesPipeline
from scrapy import Request
class HarryPipeline(object):
def process_item(self, item, spider):
return item
class HarryDownLoadPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for imgurl in item['img_url']:
yield Request(imgurl)
def item_completed(self, results, item, info):
print ('******the results is********:',results)
os.rename(IMGS + '/' + results[0][1]['path'], IMGS + '/' + item['img_name'])
def __del__(self):
#完成后删除full目录
os.removedirs(IMGS + '/' + 'full')

  注:对于def __del__(self)函数可要可不要,因为重命名过程是携带路径重命名,所以默认生成的full文件夹就为空,只是顺手删除空文件夹(如果里面有文件存在是删除不了的)

3.2 自定义图片名称代码详细解析

3.2.1    get_media_requests函数

get_media_requests方法的原型为:

def item_completed(self, results, item, info):
if isinstance(item, dict) or self.images_result_field in item.fields:
item[self.images_result_field] = [x for ok, x in results if ok]
return item

可以看到get_media_requests有三个参数,

第一个是self,这个不必多说;

第二个是 item,这个就是 spiders传递过来的 item

第三个是 info,看名字就知道这是用来保存信息的,至于是什么信息,info其实是一个用来保存保存图片的名字和下载链接的列表

3.2.2    Item_completed函数

item_completed方法的原型如下:

def item_completed(self, results, item, info):
if isinstance(item, dict) or self.images_result_field in item.fields:
item[self.images_result_field] = [x for ok, x in results if ok]
return item

注意到 item_completed里有个 results参数,results参数保存了图片下载的相关信息,将他print看看具体信息:

[(True, {'url': 'http://img.ivsky.com/img/bizhi/pre/201101/10/harry_potter5-015.jpg', 'path': 'full/539c5914730497b094e5c98bfdfe19b65f5.jpg', 'checksum': '37d23ffb0ab983ac2da9a9d'})]

真实结构为一个list [(DownLoad_success_or_failure),dict],字典中含有三个键:1、'url':图片路径 2、'path':图片下载后的保存路径 3、'checksum':校验码

从中我们可以看到只要我们修改字典中图片保存路径(路径详细到图片名称)的值,那么我们就能自定义图片名称

关键代码为:

os.rename(IMGS + '/' + results[0][1]['path'], IMGS + '/' + item['img_name'])

解释:rename函数,results[0][1]['path']意思就是:在result这个list中找到图片的名称,其中我们也可以看到这个图片的位置是绝对路径,所以需要携带路径IMGS修改。

4  更新pipelines.py后运行结果

如有疑问,欢迎留言讨论交流,转载请注明出处。

scrapy爬取图片并自定义图片名字的更多相关文章

  1. python网络爬虫之使用scrapy爬取图片

    在前面的章节中都介绍了scrapy如何爬取网页数据,今天介绍下如何爬取图片. 下载图片需要用到ImagesPipeline这个类,首先介绍下工作流程: 1 首先需要在一个爬虫中,获取到图片的url并存 ...

  2. 使用Scrapy爬取图片入库,并保存在本地

    使用Scrapy爬取图片入库,并保存在本地 上 篇博客已经简单的介绍了爬取数据流程,现在让我们继续学习scrapy 目标: 爬取爱卡汽车标题,价格以及图片存入数据库,并存图到本地 好了不多说,让我们实 ...

  3. scrapy 爬取图片

    scrapy 爬取图片 1.scrapy 有下载图片的自带接口,不用我们在去实现 setting.py设置 # 保存log信息的文件名 LOG_LEVEL = "INFO" # L ...

  4. 用scrapy爬取搜狗Lofter图片

    用scrapy爬取搜狗Lofter图片 # -*- coding: utf-8 -*- import json import scrapy from scrapy.http import Reques ...

  5. 使用scrapy框架爬取图片网全站图片(二十多万张),并打包成exe可执行文件

    目标网站:https://www.mn52.com/ 本文代码已上传至git和百度网盘,链接分享在文末 网站概览 目标,使用scrapy框架抓取全部图片并分类保存到本地. 1.创建scrapy项目 s ...

  6. python实现scrapy爬取图片到本地时的sha1摘要算法文件名

    2017-03-29 Scrapy爬图片到本地应该会给图片自动生成sha1摘要算法文件名,我第一次用scrapy也不清楚太多,就在程序里自己写了一段实现这一功能的代码.需import hashlib ...

  7. scrapy框架爬取图片并将图片保存到本地

    如果基于scrapy进行图片数据的爬取 在爬虫文件中只需要解析提取出图片地址,然后将地址提交给管道 配置文件中:IMAGES_STORE = './imgsLib' 在管道文件中进行管道类的制定: f ...

  8. Scrapy 爬取某网站图片

    1. 创建一个 Scrapy 项目,在命令行或者 Pycharm 的 Terminal 中输入: scrapy startproject imagepix 自动生成了下列文件: 2. 在 imagep ...

  9. 【Python】- scrapy 爬取图片保存到本地、且返回保存路径

    https://blog.csdn.net/xueba8/article/details/81843534

随机推荐

  1. weight decay 和正则化caffe

    正则化是为了防止过拟合,因为正则化能降低权重 caffe默认L2正则化 代码讲解的地址:http://alanse7en.github.io/caffedai-ma-jie-xi-4/ 重要的一个回答 ...

  2. EF 状态版 增删改

    1.利用 状态版 实现 增加 . 2.利用状态版 进行 删除 3. 利用状态版 实现 修改 ,修改 方法 有3种 第1种修改方法 第2种修改 方法 第3种修改方法

  3. c#转载的

    C#做项目时的一些经验分享 1.对于公用的类型定义,要单独抽取出来,放到单独的DLL中. 2.通过大量定义interface接口,来提高模块化程度,不同功能之间通过实现接口来面向接口编程. 3.如果项 ...

  4. glocktop

    glocktop: Display or print active GFS2 locks. Index of glocktop man page Read glocktop man page on L ...

  5. CentOS 7与 Windows双系统丢失Windows启动项及默认启动项修改

    1.Windows启动项消失的原因:   在安装Win7.8/10系统+CentOS7双系统后,默认会将mbr(Main Boot Record)改写为grub2,默认的CentOS7无法识别Wind ...

  6. lambda表达式的使用

    lambda表达式和可遍历的datatable结合使用,把表中某一列中的数据转成字符串,用“|”隔开,代码如下: obj = tableName.AsEnumerable();if(tableName ...

  7. Xcode 中 pch 文件配置 - iOS

    一.简介 首先 pch 文件(即:Prefix Header)是一种预编译文件,在 Xcode 6 之前创建新的工程则会自动将该文件一起创建出来,但在 Xcode 6 之后苹果官方则默认将自动创建的方 ...

  8. JavaScript 事件机制

    1 什么是事件 JavaScript 使我们有能力创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数的事件.比方说,我 ...

  9. 使用windows api安装windows服务程序(C#)

    3个步骤: 1.安装器代码编写 2.安装器工具类编写 1)安装.启动服务) 2)卸载服务 3.windows服务程序编写(参考:多线程.方便扩展的Windows服务程序框架) 4.代码下载,在文末(注 ...

  10. python3 练习题100例 (二十)

    #!/usr/bin/env python3# -*- coding: utf-8 -*-"""练习二十:判断一个年份是否是闰年公历闰年计算方法:1.普通年能被4整除且不 ...