Image Pipeline
Image Pipeline
Scrapy 提供了专门下载文件或者图片的Pipeline,下载图片与文件的原理同抓取网页的原理是一样的,所以他们的下载过程支持多线程与异步,十分的高效
Image Pipeline的工作流程
- itemPipeline从item中获取需要下载的数据,通过Request重新放入到项目队列等待调度器调度下载
- 当图片下载完成,另一个组(images)将被更新到结构中,其中包括下载图片的信息,比如下载路径,源抓取地址(从image_urls组获得)和图片的校验码. images列表中的图片顺序将和源image_urls组保持一致.如果某个图片下载失败,将会记录下错误信息,图片也不会出现在images组中
案例
- 首先在settings中配置图片存放路径 - IMAGES_STORE = './images'
 
- 在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()
 
- 定义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
 
- 定义项目管道 - 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的更多相关文章
- redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
		前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value 就是具体的customerid集合, ... 
- Building the Testing Pipeline
		This essay is a part of my knowledge sharing session slides which are shared for development and qua ... 
- Scrapy:为spider指定pipeline
		当一个Scrapy项目中有多个spider去爬取多个网站时,往往需要多个pipeline,这时就需要为每个spider指定其对应的pipeline. [通过程序来运行spider],可以通过修改配置s ... 
- 图解Netty之Pipeline、channel、Context之间的数据流向。
		声明:本文为原创博文,禁止转载. 以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件) 当用户调用channel的connect时,会发起一个 ... 
- 初识pipeline
		1.pipeline的产生 从一个现象说起,有一家咖啡吧生意特别好,每天来的客人络绎不绝,客人A来到柜台,客人B紧随其后,客人C排在客人B后面,客人D排在客人C后面,客人E排在客人D后面,一直排到店面 ... 
- MongoDB 聚合管道(Aggregation Pipeline)
		管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ... 
- SSIS Data Flow 的 Execution Tree 和 Data Pipeline
		一,Execution Tree 执行树是数据流组件(转换和适配器)基于同步关系所建立的逻辑分组,每一个分组都是一个执行树的开始和结束,也可以将执行树理解为一个缓冲区的开始和结束,即缓冲区的整个生命周 ... 
- Kafka到Hdfs的数据Pipeline整理
		作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 找时间总结整理了下数据从Kafka到Hdfs的一些pipeline,如下 1> Kafka ... 
- SQL Queries from Transactional Plugin Pipeline
		Sometimes the LINQ, Query Expressions or Fetch just doesn't give you the ability to quickly query yo ... 
- One EEG preprocessing pipeline - EEG-fMRI paradigm
		The preprocessing pipeline of EEG data from EEG-fMRI paradigm differs from that of regular EEG data, ... 
随机推荐
- Windows Server 2008 R2提示api-ms-win-crt-runtime-l1-1-0.dll 丢失解决方法
			在一台服务器的全新windows Server 2008 R2 服务器上配置php运行环境, 在启动Apache之后,显示下图错误: 解决方法: 1.安装VC redit.exe程序解决 是VC的一个 ... 
- 洛谷P2756 飞行员配对方案问题
			二分图裸题,找他的最大匹配即可 #include<bits/stdc++.h> using namespace std; int n,m,ans; ; int to[N]; struct ... 
- Android 1.7 中不支持 lambda 表达式
			Error:(129, 32) 错误: -source 1.7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) lambda expressio ... 
- servlet(1)
			servlet类分级: 1.ServletConfig接口类:理解为读取servlet配置的类,里面有四个抽象方法如下: ①getServletName:获取servlet在web.xml中的名字 ② ... 
- Word技巧设置
			1.如何在Word中快速输入上下标 下标~~同时按住:Ctrl 和 =键: 上标~~同时按住:Ctrl 和 Shift 和 +键: 2.如何删除Word中产生的空白页 设置 段落 中的 固定值 ... 
- 关于小米4电信4g刷入第三方ROM无信号解决办法
			from: http://www.yuwantb.com/xiaomi4-lineage-os.html 关于小米4电信4g刷入第三方ROM无信号解决办法 下载这个电信4g补丁包. 链接:http ... 
- 自定义select标签箭头样式
			select::-ms-expand{ display: none; }//ie样式清除 select{ appearance:none; -moz-appearance:none; -webkit- ... 
- flink部署操作-flink standalone集群安装部署
			flink集群安装部署 standalone集群模式 必须依赖 必须的软件 JAVA_HOME配置 flink安装 配置flink 启动flink 添加Jobmanager/taskmanager 实 ... 
- hbuilder、hbuilderx和vscode对比
			1. 从内存来对比 1.1 vscode占用内存 打开同一个项目,发现vscode占用内存比较多 1.2 HBuilder占用内存 1.3 HBuilderx占用内存 1.4 对比 从内存上来看,HB ... 
- Grains 与 Pillars
			Grains 与 Pillars Grains介绍 Grains接口是salt用来采集底层系统信息的,包含了操作系统信息.域名.IP地址.内核.内存等一些底层信息.就是因为grains采集了这些信息, ... 
