scrapy的常用ImagesPipeline重写实现

参考了这篇文章https://www.xuebuyuan.com/140.html

在pipeline中重写重写一个pipeline并且继承ImagesPipeline
定义默认的item(若写成其他的字段则需要在get_media_requests里重写)
class ImageItem(scrapy.Item):
    image_urls = scrapy.Field()
    images = scrapy.Field()

重写ImagesPipeline
import hashlib  # 下载图片地址哈希命名
from scrapy.http import Request  # 请求下载图片管道用
from scrapy.pipelines.images import ImagesPipeline
from scrapy.utils.python import to_bytes  # 下载图片用
from .items import WebSiteNewsItem

class DownloadImagesPipeline(ImagesPipeline):  # 下载图片的管道,

    def get_media_requests(self, item, info):  # 请求获取图片
        '''ImagePipeline根据image_urls中指定的url进行爬取,若不用默认字段则在这里重写
           可以通过get_media_requests为每个url生成一个Request
           get_media_requests函数返回示例如下:
           [(True,
               {’checksum’: ’2b00042f7481c7b056c4b410d28f33cf’,
               ’path’: ’full/7d97e98f8af710c7e7fe703abc8f639e0ee507c4.jpg’,
               ’url’: ’http://www.example.com/images/product1.jpg’}),
           (True,
               {’checksum’: ’b9628c4ab9b595f72f280b90c4fd093d’,
               ’path’: ’full/1ca5879492b8fd606df1964ea3c1e2f4520f076f.jpg’,
               ’url’: ’http://www.example.com/images/product2.jpg’}),
           (False,
               Failure(...))]
        '''
        if isinstance(item, WebSiteNewsItem) and item.get('image_list') and item.get('publish_date'):
            for image_url in item['image_list'].split(u','):  # 从item的image_list字段中 分割出图片链接地址
                yield Request(image_url.replace('\\', '/'), meta={'publish_date': info.spider.publish_date},
                              headers={'Referer': item['url']})
                # 链接中"\\"替换为"/" 向图片地址发出请求

    def item_completed(self, results, item, info):
        '''所有图片处理完毕后(不管下载成功或失败),会调用item_completed进行处理
           results是一个list 第一个为图片下载状态,
           get_media_requests在图片下载完毕后,处理结果会以二元组的方式返回给item_completed()函数的
           results,图片下载状态定义如下:
               (success, image_info_or_failure)  
               success表示图片是否下载成功;image_info_or_failure是一个字典
        '''
        image_paths = [info.get('path', None) for success, info in results if success and info]
        if not image_paths:
            return item
        if isinstance(item, WebSiteNewsItem):
            item['image_list'] = u','.join(image_paths)
        return item

    def file_path(self, request, response=None, info=None):
        image_guid = hashlib.sha1(to_bytes(request.url)).hexdigest()  # 对请求地址取哈希值
        return u'%s/%s/%s.jpg' % (

            request.meta['publish_date'].strftime('%Y-%m/%Y%m%d'),  # 这里构建了两级地址
            info.spider.zh_name, image_guid)
        # 发表日期,爬虫中文名,哈希值拼成路径,存储图片的路径类似于:2018-10/20181017/爬虫中文名/图片哈希值

配置好settings
import os

import os
ITEM_PIPELINES = {
    #自定义的pipelines
    'articleSpider.pipelines.MyImagesPipeline': 300,
}
#自定义存储imageurl的字段,item["front_image_url"]
IMAGES_URL_FILED = "front_image_url"
#工程根目录
project_dir = os.path.dirname(__file__)
#下载图片存储位置
IMAGES_STORE = os.path.join(project_dir, 'images')

# 其他参数
# 该字段的值为XxxItem中定义的存储图片链接的image_urls字段
# IMAGES_URLS_FIELD='image_urls'
# 该字段的值为XxxItem中定义的存储图片信息的images字段
# IMAGES_RESULT_FIELD='images'
# 生成缩略图(可选)
'''
IMAGES_THUMBS = {
    'small': (50, 50),
    'big': (270, 270),
}
'''
# 过期时间,单位:天(可选)
# IMAGES_EXPIRES = 120
# 过滤小图片(可选)
# IMAGES_MIN_HEIGHT = 110
# IMAGES_MIN_WIDTH = 110
# 是否允许重定向(可选)
# MEDIA_ALLOW_REDIRECTS = True
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Media Pipeline Scrapy为下载item中包含的文件(比如在爬取到产品时,同时也想保存对应的图片)...
    cnkai阅读 2,390评论 2 1
  • 学习python时,爬虫是一种简单上手的方式,应该也是一个必经阶段。本项目用Scrapy框架实现了抓取豆瓣top2...
    豌豆花下猫阅读 1,089评论 0 6
  • 突然很想你 和我在一起的点点滴滴 风吹过来 心底一片涟漪 突然很想抱着你 莫名的愁绪 又有点想哭泣 突然很想你 思...
    暖暖百合花阅读 89评论 0 3
  • 某天,小微和好友Vivian外出游玩。两人去到了一个景色优美的路游景点,这时Vivian提议拍照留念,但是两人却忘...
    咘染阅读 171评论 0 0
  • 晚上被老妈拉着看中央11频道的京剧《锁麟囊》,电视里唱着,妈妈在旁边跟我讲解,故事大概是:以前有一位富家小...
    佳子的乐园阅读 1,025评论 2 4