[scrapy] images pipeline分析– 下载图片如何上传到阿里云服务

目录

  • 源起
  • 准备
  • 分析
  • 实践
  • 总结

源起

现在网上已经有很多方便的云存储了,比如阿里云的oss,亚马逊的s3 ,Azure 的blob,云的储存对于大数据量的文件或者图片来说,绝对是相当的方便,现在我们就来分析一下,如何使用scrapy的pipeline ,将我们下载图片直接上传到我们的阿里云oss服务

代码地址

背景知识

准备

  • python: 2.7
  • 依赖库
    • Scrapy==1.5.0
    • oss2==2.4.0
    • Pillow==5.1.0

分析

拿到一个现有的需求,我们可以参考现有的项目里面,是否已经有实现过的代码做为参考,我们知道,scrapy项目一直有对s3(亚马逊云存储),我们可以直接去scrapy的源代码里面去找

通过ImagesPipeline 我们发现在实例化类的时候会初使化一个s3store的对象

https://github.com/scrapy/scrapy/blob/master/scrapy/pipelines/images.py
《[scrapy] images pipeline分析– 下载图片如何上传到阿里云服务》

ImagesPipeline继承自FilesPipeline,我们进一步查找

《[scrapy] images pipeline分析– 下载图片如何上传到阿里云服务》

进一步查找这个s3 store 类是怎么实现的
《[scrapy] images pipeline分析– 下载图片如何上传到阿里云服务》

OK,我们分析完了源码,基本得出结论:只要照样子实现这个alioss store 就可以存储到我们的云服务了

实践

由于我们是直接上传到oss目录,所以完全不用使用到缩略图片的功能

alioss store 构建

pipeline的构建

在settings.py 文件中配置我们的oss

以上节点配置请参考阿里云的oss sdk 文档

效果图

《[scrapy] images pipeline分析– 下载图片如何上传到阿里云服务》

总结

我们这次主要解决了scrapy使用ImagesPipeline 下载图片,并上传到我们云服务的过程,我们的思维过程是

拿到一个需求,我们可以先参考现有的逻辑和工程代码,不要怕,总会有解决方案的,要自己多看源代码。
本次的代码已经上传到git上了,欢迎star或者fork

代码地址: https://github.com/BruceDone/scrapy_demo/tree/master/douban_oss

点赞
  1. 苏先生说道:

    请问 上传到七牛云中,怎么处理呢

    1. bruce说道:

      参考他们的sdk , https://developer.qiniu.com/kodo/sdk/1242/python ,稍微修改一下代码就OK了

      1. 苏先生说道:

        我试过 按照你这样的修改成 七牛云的,但是一直不行,你能帮我看看怎么写最好吗

        1. bruce说道:

          可以打断点debug的,你可以看下具体问题是啥,不难的

  2. 苏先生说道:

    我还是没能成功执行~~~

    1. bruce说道:

      要学会自己debug啦~

  3. 说道:

    :biggrin: :biggrin: 我在上传过程中,报了这个错误。[scrapy.pipelines.files] WARNING: File (unknown-error): Error downloading image from referred in : 'splash'
    因为我使用了splash进行js渲染,但是这跟图片应该没关系把。。

    1. bruce说道:

      按道理没有太大的影响,你可以直接把这些因为splash 相当于一个中间层,在返回给middleware 的时候会添加一个上层的refer ,你将返回的response 中这个refer 移除掉就可以了。

      1. 说道:

        还是不行,我找到scrapy.pipelines.files 中的 media_to_download 方法,尝试去除referer,但还是报错,图片依旧无法上传到oss, 我换了一种思路,在 imagepipeline 的 get_media_requests方法,将原始的Requet对象替换为SplashRequest对象,结果成功了,但是它渲染出来的图片有白色背景,并且它的图片尺寸也被固定了1024x768, 还有没有好的方法,告诉ImagePipeline, 我需要根据image_url使用原始的Requet进行下载??

  4. pkz说道:

    请问如果要下载gif图片应该怎么改来着

    1. bruce说道:

      你可以直接用原来的FilePipeline来进行下载,改造思路是一样的

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据