Image Pipeline

Scrapy 提供了专门下载文件或者图片的Pipeline,下载图片与文件的原理同抓取网页的原理是一样的,所以他们的下载过程支持多线程与异步,十分的高效

Image Pipeline的工作流程

  1. itemPipeline从item中获取需要下载的数据,通过Request重新放入到项目队列等待调度器调度下载
  2. 当图片下载完成,另一个组(images)将被更新到结构中,其中包括下载图片的信息,比如下载路径,源抓取地址(从image_urls组获得)和图片的校验码. images列表中的图片顺序将和源image_urls组保持一致.如果某个图片下载失败,将会记录下错误信息,图片也不会出现在images组中

参考链接

案例

  1. 首先在settings中配置图片存放路径

    IMAGES_STORE = './images'
  2. 在item中定义需要的数据结构

    class Images360Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    collection = table = "images"
    id = scrapy.Field()
    title = scrapy.Field()
    url = scrapy.Field()
    thumb = scrapy.Field()
  3. 定义spider与parse

    import scrapy
    from urllib.parse import urlencode
    from scrapy import Request
    from images360.images360.items import Images360Item class ImagesSpider(scrapy.Spider):
    name = 'images'
    allowed_domains = ['images.so.com']
    start_urls = ['http://images.so.com/'] def start_requests(self):
    data = {'ch': 'photography',
    'listtype': 'hot', }
    base_url = 'http://images.so.com/zj?'
    for page in range(1, self.settings.get('MAX_PAGE_SIZE') + 1):
    sn = page * 30
    data['sn'] = sn
    params = urlencode(data)
    url = base_url + params
    print(url)
    yield Request(url, self.parse) def parse(self, response):
    html = json.loads(response.text)
    datas = html.get('list', '')
    if datas:
    for data in datas:
    images_item = Images360Item()
    images_item['id'] = data.get('imageid', '')
    images_item['title'] = data.get('group_title', '')
    images_item['url'] = data.get('qhimg_url', '')
    images_item['thumb'] = data.get('qhimg_thumb_url', '')
    yield images_item
  4. 定义项目管道

    from scrapy import Request
    from scrapy.exceptions import DropItem
    from scrapy.pipelines.images import ImagesPipeline class ImagesPipeline(ImagesPipeline): # 将item中的url取出来 通过Request继续放入到调度器中执行
    def get_media_requests(self, item, info):
    yield Request(item['url']) # request对应的是当前下载对象,该函数用于放回 文件名
    def file_path(self, request, response=None, info=None):
    url = request.url
    print('url============', url)
    file_name = url.split('/')[-1]
    return file_name # 单个item完成下载时的处理方法
    def item_completed(self,results,item,info):
    # results为Item对应的下载结果
    # print(results)
    # [(True, {'url': 'http://p2.so.qhimgs1.com/t01b866193d9b2101de.jpg', 'path': 't01b866193d9b2101de.jpg',
    # 'checksum': 'e074b5cbacd22ac38480d84506fedf02'})] image_path = [x['path'] for ok,x in results if ok]
    if image_path:
    return item
    else:
    raise DropItem('image download failed')

    注:ImagePipeline的优先级别应该比存入数据库的级别高

Image Pipeline的更多相关文章

  1. redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

    前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value 就是具体的customerid集合, ...

  2. Building the Testing Pipeline

    This essay is a part of my knowledge sharing session slides which are shared for development and qua ...

  3. Scrapy:为spider指定pipeline

    当一个Scrapy项目中有多个spider去爬取多个网站时,往往需要多个pipeline,这时就需要为每个spider指定其对应的pipeline. [通过程序来运行spider],可以通过修改配置s ...

  4. 图解Netty之Pipeline、channel、Context之间的数据流向。

    声明:本文为原创博文,禁止转载.       以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件)  当用户调用channel的connect时,会发起一个 ...

  5. 初识pipeline

    1.pipeline的产生 从一个现象说起,有一家咖啡吧生意特别好,每天来的客人络绎不绝,客人A来到柜台,客人B紧随其后,客人C排在客人B后面,客人D排在客人C后面,客人E排在客人D后面,一直排到店面 ...

  6. MongoDB 聚合管道(Aggregation Pipeline)

    管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...

  7. SSIS Data Flow 的 Execution Tree 和 Data Pipeline

    一,Execution Tree 执行树是数据流组件(转换和适配器)基于同步关系所建立的逻辑分组,每一个分组都是一个执行树的开始和结束,也可以将执行树理解为一个缓冲区的开始和结束,即缓冲区的整个生命周 ...

  8. Kafka到Hdfs的数据Pipeline整理

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 找时间总结整理了下数据从Kafka到Hdfs的一些pipeline,如下 1> Kafka ...

  9. SQL Queries from Transactional Plugin Pipeline

    Sometimes the LINQ, Query Expressions or Fetch just doesn't give you the ability to quickly query yo ...

  10. One EEG preprocessing pipeline - EEG-fMRI paradigm

    The preprocessing pipeline of EEG data from EEG-fMRI paradigm differs from that of regular EEG data, ...

随机推荐

  1. vue-cli3相关

    此时做的一个vue-cli3项目build后,app.js达到了10M,主要为elementui.quill等组件: 最开始使用“compression-webpack-plugin”插件根据网上的说 ...

  2. mysql-笔记-类型转化

    1 concat() 隐式转化为字符串 2 cast( 1 as char) 显示转化 3 比较中的隐式转化 null 与任何值比例都是null : 除了使用 null-safe <=> ...

  3. C#入门教程源码

    C#入门教程源码 [日期:2019-01-26] 来源:51zxw.net  作者:zhangguofu [字体:大 中 小] 方法一:百度云盘下载地址: 链接:https://pan.baidu.c ...

  4. Flask 构建微电影视频网站(七)

    电影模块实现 上映预告 @home.route("/animation/") def animation(): """ 首页轮播动画 "&q ...

  5. 【UOJ448】【集训队作业2018】人类的本质 min_25筛

    题目大意 给你 \(n,m\),求 \[ \sum_{i=1}^n\sum_{x_1,x_2,\ldots,x_m=1}^i\operatorname{lcm}(\gcd(i,x_1),\gcd(i, ...

  6. Miller_Rabbin&&Pollard_Rho 学习笔记

    占坑,待填 I Intro 首先我们考虑这样一个问题 给定一个正整数\(p(p<=1e8)\),请判断它是不是质数 妈妈我会试除法! 于是,我们枚举$ \sqrt p$ 以内的所有数,就可以非常 ...

  7. [NOI2017]游戏

    题目描述 http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf 题解 如果说没有x的话,那么每一局只能有两种选择,可以描述为是/非,每条限制也可以 ...

  8. Intellij IDEA 14中使用MyBatis-generator 自动生成MyBatis代码

    一:项目建立好及其基本的测试好 二:在maven项目的pom.xml 添加mybatis-generator-maven-plugin 插件 <build> <finalName&g ...

  9. (十一)QPainter绘图, QPixmap,QImage,QPicture,QBitmap

    #include "widget.h" #include "ui_widget.h" #include <QPainter> #include &l ...

  10. CC1310 笔记

    GPIO控制: #include <ti/drivers/GPIO.h> GPIO_init() 函数会调用 结构体实例 GPIOCC26XX_config,把需要使用到的GPIO放一起, ...