zoukankan      html  css  js  c++  java
  • 改写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请求,
    并没有item,后来找到了下面的例子

    class RefererImagePipeline(ImagesPipeline):
        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
     
    
      
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- focus on what you want to be
  • 相关阅读:
    Java基础知识强化之IO流笔记77:NIO之 Selector
    Java基础知识强化之IO流笔记76:NIO之 Channel(通道)之间的数据传输
    Java基础知识强化之IO流笔记75:NIO之 Scatter / Gather
    Java基础知识强化之IO流笔记74:NIO之 Buffer
    Java基础知识强化之IO流笔记73:NIO之 Channel
    Java基础知识强化之IO流笔记72:NIO之 NIO核心组件(NIO使用代码示例)
    谈谈数据库连接池
    纯JSP实现简单登录跳转
    快速查找无序数组中的第K大数?
    新版汉诺塔(UVa10795
  • 原文地址:https://www.cnblogs.com/bamboozone/p/10495229.html
Copyright © 2011-2022 走看看