当前位置: 首页 > news >正文

Scrapy ImagePipeline(图片下载组件)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Scrapy用ImagesPipeline类提供一种方便的方式来下载和存储图片。需要PIL库支持。

主要特征

  • 将下载图片转换成通用的JPG和RGB格式
  • 避免重复下载
  • 缩略图生成
  • 图片大小过滤

工作流程

  • 爬取一个Item,将图片的URLs放入image_urls字段
  • Spider返回的Item,传递到Item Pipeline
  • Item传递到ImagePipeline,将调用Scrapy 调度器和下载器完成image_urls中的url的调度和下载。ImagePipeline会自动高优先级抓取这些url,于此同时,item会被锁定直到图片抓取完毕才被解锁。
  • 图片下载成功结束后,图片下载路径、url和校验和等信息会被填充到images字段中。

定义Item

使用ImagePipeline需要在配置文件中配置ITEMPIPELINES属性,并定义一个Item包含imageurls和images字段

class ImageItem(Item):
    image_urls = Field()
    images = Field()
    image_paths = Field()

设置条件和属性settings.py

ITEM_PIPELINES = ['demo.pipelines.MyImagesPipeline']  # ImagePipeline的自定义实现类
IMAGES_STORE = 'D:\\dev\\python\\scrapy\\demo\\img'   # 图片存储路径
IMAGES_EXPIRES = 90                                   # 过期天数
IMAGES_MIN_HEIGHT = 100                               # 图片的最小高度
IMAGES_MIN_WIDTH = 100                                # 图片的最小宽度
# 图片的尺寸小于IMAGES_MIN_WIDTH*IMAGES_MIN_HEIGHT的图片都会被过滤

ImageSpider

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

from demo.items import ImageItem

class MyImageSpider(BaseSpider):
    name = "image_spider"
    allowed_domains = ["http://topit.me/"]
    start_urls = [
        "http://topit.me/",
    ]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        imgs = hxs.select('//img/@src').extract()
        item = ImageItem()
        item['image_urls']=imgs
        return item

ImagePipeline

需要在自定义的ImagePipeline类中重载的方法:get_media_requests(item, info)item_completed(results, items, info)

正如工作流程所示,Pipeline将从item中获取图片的URLs并下载它们,所以必须重载get_media_requests,并返回一个Request对象,这些请求对象将被Pipeline处理,当完成下载后,结果将发送到item_completed方法,这些结果为一个二元组的list,每个元祖的包含(success, image_info_or_failure)。 * successboolean值,true表示成功下载 * image_info_or_error:如果success=trueimage_info_or_error词典包含以下键值对* url:原始URL * path:本地存储路径 * checksum:校验码。失败则包含一些出错信息。

from scrapy.contrib.pipeline.images import ImagesPipeline
from scrapy.exceptions import DropItem
from scrapy.http import Request

class MyImagesPipeline(ImagesPipeline):

    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield Request(image_url)


    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item['image_paths'] = image_paths
        return item

运行结果

$ scrapy crawl image_spider
.....
2013-09-10 15:49:48+0800 [image_spider] DEBUG: Scraped from <200 http://topit.me/>
    {'image_paths': ['full/4285ec809413767e8dd5daf4a57fbfe97d964e2e.jpg',
                     'full/b8088f68ba1d569c96b04a3664e115d4833544be.jpg',
                     ....
                     'full/97f2272a06191cda15abda57e03ec29eb5c51959.jpg',
                     'full/9afc3ed6b6cf8259b4065a0d2d79f49b6670c51b.jpg'],
     'image_urls': [u'http://img.topit.me/logo.gif',
                    u'http://fe.topit.me/e/a3/43/117387157785b43a3em.jpg',
                    ...
                    u'http://i.topit.me/9/v/3LOGi2v9m.jpg',
                    u'http://www.topit.me/img/link/mobile.jpg']}
2013-09-10 15:49:48+0800 [image_spider] INFO: Closing spider (finished)
....

注: 在这里提醒一下,当使用多个pipeline组件时,通过setting-》ITEM-PIPELINE中的数值设置组建的运行顺序,但是如果两个pipeline的顺序不一致,则只通过最开始的pipeline的item处理

希望大家多多指正,谢谢!

转载于:https://my.oschina.net/superroy/blog/789151

相关文章:

  • Spring boot ---- java.lang.NoClassDefFoundError: javax/servlet/ServletContext
  • Java读取表格数据
  • 将js对象转为json对象属性加上引号
  • 【Augmented Reality】增强现实中的光学透射式头盔显示器的标定进阶
  • 词向量的运用-用词向量理解词组的含义
  • laravel 5.3 ——路由(资源,别名)
  • SimpleDateFormat的线程安全问题
  • 函数递归
  • 【转】configure/make/make install的使用说明
  • PHP转义Json里的特殊字符的函数
  • C# 获取本机的所有ip地址,并过滤内网ip
  • 位/字节/ASCII/UTF-8/GBK/GB2312/Unicode 扫盲
  • Spark RDD学习: aggregate函数
  • 科技产品也要讲时尚 P9红蓝新色彰显独特风格
  • 在Windows 10下启用旧的照片查看器
  • 「译」Node.js Streams 基础
  • Java应用性能调优
  • Redis的resp协议
  • Shell编程
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Swoft 源码剖析 - 代码自动更新机制
  • Travix是如何部署应用程序到Kubernetes上的
  • 高度不固定时垂直居中
  • 如何选择开源的机器学习框架?
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 微信小程序填坑清单
  • 微信小程序--------语音识别(前端自己也能玩)
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​flutter 代码混淆
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • !!java web学习笔记(一到五)
  • (LeetCode 49)Anagrams
  • (MATLAB)第五章-矩阵运算
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (数据结构)顺序表的定义
  • (转)visual stdio 书签功能介绍
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET运行机制
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • .考试倒计时43天!来提分啦!
  • @RequestMapping-占位符映射
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [2016.7 day.5] T2
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等
  • [github配置] 远程访问仓库以及问题解决