• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
oooooolr
You can do anything but not everything. ——David Allen
博客园    首页    新随笔    联系   管理    订阅  订阅

改写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
posted @ 2019-03-08 13:30  oooooolr  阅读(320)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3