改写pipeline
为什么要改写方法:get_media_requests,他们的区别在哪里
def get_media_requests(self, item, info):#原始的
return [Request(x) for x in item.get(self.images_urls_field, [])] def get_media_requests(self, item, info):#修改的
for file_url in item['file_urls']:
yield scrapy.Request(file_url)
refer: https://www.imooc.com/article/21840 这篇文章介绍了多种实例
def get_media_requests(self, item, info):
request_objects = super(AudiImagesPipeline, self).get_media_requests(item, info) # super()直接调用父类对象
for request_object in request_objects:
request_object.item = item
return request_objects
#这个是网易云课堂的写法,网上很多也都是这个写法,但是不理解request_object.item 为什么会有一个item,super().get_media_requests(item, info)返回的是request请求,class RefererImagePipeline(ImagesPipeline):
并没有item,后来找到了下面的例子
def get_media_requests(self, item, info):
requests = super().get_media_requests(item, info)
for req in requests:
req.headers.appendlist("referer", item['referer'])
return requests #这个是修改返回的request的headers,这个就比较容易接受了,仔细看博主的文章,又发现了下面的例子
如果文件名生成规则更加复杂,可以参考znns项目中的pipeline编写。他这里要根据路径生成多级文件夹保存图片,所以他的图片Item需要额外几个属性设置图片分类等。这时候就需要重写get_media_requests方法,从image_urls获取图片地址请求的时候用Request的meta属性将对应的图片Item也传进去,这样在生成文件名的时候就可以读取meta属性来确定图片的分类等信息了。
class ZnnsPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for image_url in item['image_urls']:
yield Request(image_url, meta={'item': item}, headers=headers) #
# 这里把item传过去,因为后面需要用item里面的书名和章节作为文件名 ##@@#这里就是他传item的用法,用meta传参数
*****************************************************************************************************
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")
return item def file_path(self, request, response=None, info=None):
item = request.meta['item']
image_guid = request.url.split('/')[-1]
filename = u'full/{0[name]}/{0[albumname]}/{1}'.format(item, image_guid) #这个file_path的写法比较优雅
return filename
#另:通过列表索引设置参数
my_list = ['菜鸟教程', 'www.runoob.com']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是必须的
网站名:菜鸟教程, 地址 www.runoob.com
改写pipeline的更多相关文章
- 基于Python,scrapy,redis的分布式爬虫实现框架
		原文 http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ... 
- OpenVINO 目标检测底层C++代码改写实现(待优化)
		System: Centos7.4 I:OpenVINO 的安装 refer:https://docs.openvinotoolkit.org/latest/_docs_install_guides_ ... 
- Ruby Rails学习中:Sass 和 Asset Pipeline,布局中的链接(Rails路由,具名路由),用户注册: 第一步
		接上篇: 一.Sass 和 Asset Pipeline Rails 中最有用的功能之一是 Asset Pipeline, 它极大地简化了静态资源文件(CSS.JavaScript 和图像)的生成和管 ... 
- redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
		前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value 就是具体的customerid集合, ... 
- 为Xamarin更好的开发而改写的库
		欢迎大家加入以下开源社区 Xamarin-Cn:https://github.com/Xamarin-Cn Mvvmcross-Cn:https://github.com/Mvvmcross-Cn ... 
- 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 ... 
- .NET跨平台之旅:基于.NET Core改写EnyimMemcached,实现Linux上访问memcached缓存
		注:支持 .NET Core 的 memcached 客户端 EnyimMemcachedCore 的 NuGet 包下载地址:https://www.nuget.org/packages/Enyim ... 
- 图解Netty之Pipeline、channel、Context之间的数据流向。
		声明:本文为原创博文,禁止转载. 以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件) 当用户调用channel的connect时,会发起一个 ... 
随机推荐
- SpringMVC+ Mybatis 配置多数据源 + 自动数据源切换  + 实现数据库读写分离
			现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应 ... 
- 208道最常见的Java面试题整理(面试必备)
			适宜阅读人群 需要面试的初/中/高级 java 程序员 想要查漏补缺的人 想要不断完善和扩充自己 java 技术栈的人 java 面试官 具体面试题 下面一起来看 208 道面试题,具体的内容. 一. ... 
- CentOS安装和配置FTP
			1.安装vsftpd #安装vsftpd yum install -y vsftpd #设置开机启动 systemctl enable vsftpd.service # 重启 service vsft ... 
- 24访问者模式Visitor
			一.什么是访问者模式 Visitor模式也叫访问者模式,是行为模式之一 ,它分离对象的数据和行为,使用Visitor模式, 可以不修改已有类的情况下,增加新的操作. 二.访问者模式的应用示例 比如有一 ... 
- iOS 调试大法
			本文转载至 http://www.jianshu.com/p/d19e19a91071 0.笨办法 看变量.对象?NSLog+重新编译运行:改某对象?改源码+重新编译运行:隔离某个方法?在方法中写 r ... 
- 【微信开发】cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
			在做微信开发时候,请求为你接口报错: 解决方案: 1 下载cacert https://curl.haxx.se/ca/cacert.pem 2 修改 php.ini , 并重启 curl.cainf ... 
- Nestjs OpenAPI(Swagger)
			官方文档 用来描述api 
- [ACM-ICPC 2018 徐州赛区网络预赛][D. Easy Math]
			题目链接:Easy Math 题目大意:给定\(n(1\leqslant n\leqslant 10^{12}),m(1\leqslant m\leqslant 2*10^{9})\),求\(\sum ... 
- JWT(Json Web Token—)的定义及组成
			JWT定义及其组成 JWT(JSON Web Token)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 一个JWT实际上就是一个字符串,它由三部分组成,头部. ... 
- mysql InnoDB锁等待的查看及分析
			说明:前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处 ... 
