学会运用爬虫框架 Scrapy (四) —— 高效下载图片

爬虫程序爬取的目标通常不仅仅是文字资源,经常也会爬取图片资源。这就涉及如何高效下载图片的问题。这里高效下载指的是既能把图片完整下载到本地又不会对网站服务器造成压力。也许你会这么做,在 pipeline 中自己实现下载图片逻辑。但 Scrapy 提供了图片管道ImagesPipeline,方便我们操作下载图片。

1 为什么要选用 ImagesPipeline ?

ImagesPipeline 具有以下特点:

  • 将所有下载的图片转换成通用的格式(JPG)和模式(RGB)
  • 避免重新下载最近已经下载过的图片
  • 缩略图生成
  • 检测图像的宽/高,确保它们满足最小限制

2 具体实现

2.1 定义字段

在 item.py 文件中定义我们两个字段image_urlsimages_path

2.2 编写 spider

我以爬取 freebuf 首页部分图片为例子讲解。具体代码如下:

我新建一个名为PicsDownloadPipeline的类。需要注意一点的是: Scrapy 默认生成的类是继承Object, 要将该类修改为继承ImagesPipeline。然后实现get_media_requestsitem_completed这两个函数。

  • get_media_requests(item, info)

ImagePipeline 根据 image_urls 中指定的 url 进行爬取,可以通过 get_media_requests 为每个 url 生成一个 Request。具体实现如下:

  • item_completed(self, results, item, info)

当一个单独项目中的所有图片请求完成时,该方法会被调用。处理结果会以二元组的方式返回给 item_completed() 函数。这个二元组定义如下:(success, image_info_or_failure) 其中,第一个元素表示图片是否下载成功;第二个元素是一个字典,包含三个属性: 1) url - 图片下载的url。这是从 get_media_requests() 方法返回请求的url。 2) path - 图片存储的路径(类似 IMAGES_STORE) 3) checksum - 图片内容的 MD5 hash

具体实现如下:

综合起来,PicsDownloadPipeline 的实现下载图片逻辑的代码如下:

2.4 配置设置

在 setting.py 配置存放图片的路径以及自定义下载的图片管道。

2.5 运行程序

在 Scrapy 项目的根目录下,执行以下命令:

如果你使用的 Python 版本是 3.x 的,可能会报出以下的错误。

这是因为 Scrapy 框架用到这个Python Imaging Library (PIL)图片加载库,但是这个库只支持 2.x 版本,所以会运行出错。对于使用 Python 3.x 版本的我们,难道就束手无策?Scrapy 的开发者建议我们使用更好的图片加载库Pillow。为什么说更好呢?一方面是兼容了 PIL,另一方面在该库支持生成缩略图。

因此,我们安装 Pillow 就能解决运行报错的问题。具体安装 Pillow命令如下:

安装之后,重新运行爬虫程序。Scrapy 会运行结果中显示我们定义的image_urlsimages_path字段。

2.6 运行结果

我们会发现在 D 盘有个名为freebuf的文件夹。在该文件夹中有个full文件夹,里面存放我们刚才爬取到的图片。

如果有在 setting.py 文件中设置生成缩略图。

那么到时候,与full同级的目录下会多出个thumbs文件夹。里面会有两个文件夹smallbig,分别对应小分辨率的图片和大分辨率的图片。

3 优化

3.1 避免重复下载

在 setting.py 中新增以下配置可以避免下载最近已经下载的图片。

设置该字段,对于已经完成爬取的网站,重新运行爬虫程序。爬虫程序不会重新下载新的图片资源。

3.2自动限速(AutoTrottle)

下载图片是比较消耗服务器的资源以及流量。如果图片资源比较大,爬虫程序一直在下载图片。这会对目标网站造成一定的影响。同时,爬虫有可能遭到封杀的情况。

因此,我们有必要对爬虫程序做爬取限速处理。Scrapy 已经为我们提供了AutoTrottle功能。

只要在 setting.py 中开启AutoTrottle功能并配置限速算法即可。我采用默认的配置,具体配置如下:

值得注意的是,启用AutoThrottle扩展时,仍然受到DOWNLOAD_DELAY(下载延迟)和CONCURRENT_REQUESTS_PER_DOMAIN(对单个网站进行并发请求的最大值)以及CONCURRENT_REQUESTS_PER_IP(对单个IP进行并发请求的最大值)的约束。

推荐:学会运用爬虫框架 Scrapy (二)

上文:学会运用爬虫框架 Scrapy (三)

作者:猴哥,公众号:极客猴。爱好读书,喜欢钻研技术,梦想成为文艺青年的IT Boy。

- END -

原文发布于微信公众号 - 极客猴(Geek_monkey)

原文发表时间:2017-09-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

资源 | Parris:机器学习算法自动化训练工具

35890
来自专栏阮一峰的网络日志

如何读懂火焰图?

软件的性能分析,往往需要查看 CPU 耗时,了解瓶颈在哪里。 火焰图(flame graph)是性能分析的利器。本文介绍它的基本用法。 ? 一、perf 命令 ...

37060
来自专栏liulun

windows服务器性能监控工具、方法及关键指标

监控方法 推荐使用windows自带的“性能监视器”(老版本的windows叫性能计数器)来监控服务器的性能。 打开控制面板内的管理工具,在管理工具内打开性能监...

57360
来自专栏GAN&CV

ubuntu16.04安装caffe cpu版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/d...

27740
来自专栏专注数据中心高性能网络技术研发

[RoCE]网络QoS总结

 1.什么是QoS QoS是一种机制,它给一个网络流赋予一个优先级,并且管理它的最低需求(guarantees),极限能力(limitations)和它相比其他...

40850
来自专栏ericzli

Jetson TX1上安装Tensorflow Serving遇到的问题总结

本文的目的是分享在TX1上安装Tensorflow Serving时遇到的主要问题,避免重复踩坑。

40440
来自专栏吉浦迅科技

【入门篇】一个小白在Jetson TX2上安装caffe的踩坑之旅

作为一个在深度学习上的小白,买Jetson TX2一个很大的原因就是想学习深度学习。那么当用Jetpack刷好板子后,第一个任务肯定是要学着安装caffe!...

659110
来自专栏V站

Knowledge丨WordPress数据库文件分析

折腾WordPress必须要有很厚的基础才行,深入更是要小心。西顾再次mark下来知更鸟的文章,做下笔记。想研究模板,可review下前文《Skill丨Word...

22940
来自专栏Python中文社区

Django 博客教程(三):创建应用和编写数据库模型

專 欄 ❈追梦人物,Python中文社区专栏作者。电子科技大学计算机学院研究生,从事大数据分析研究方向。主要使用 Python 语言进行相关数据的分析,熟练使...

21690
来自专栏深度学习那些事儿

WordPress中实现Markdown编辑的终极解决方案

之前我在这篇文章中简单介绍过如何利用Markdown在wordpress中进行写作:https://oldpan.me/archives/wordpress-m...

23230

扫码关注云+社区

领取腾讯云代金券