【爬虫军火库】下载保存图片(文件)

今天开始开一个新坑,暂且叫做【爬虫军火库】吧。以前一直想系统地写些东西,最终大都未能成文,想来我不适合发宏愿立长志,还是一步一个脚印地写点零碎的东西。有关爬虫,以后会写很多东西,写完以后再进行梳理好了。

之所以要写军火库,是因为在写爬虫的过程中,遇到过很多重复性的工作。即便是Python的社区环境已经提供了很多很方便的第三方库,在实际操作中也难免需要根据不同情况做很多具体的分析。所以接下来要写的这个系列,会很像一个utils,记录一些小而实用、可复用的代码段,有些时候不会去关注前因后果,只是简简单单地聚焦在一个很小的功能上。仅此而已。

是为短序。

军火库这个系列没有严格顺序,想到什么、遇到什么,就会及时地写下来。

昨天在后台收到一个提问:

于是今天我们先来写一下下载、保存图片(文件)的方法。

假设现在已有一个图片(文件)的网址,如何保存到本地。

1、最简便的办法,使用urllib.request.urlretrieve

用法:urlretrieve(url, filename=None, reporthook=None, data=None)

示例1:http://placekitten.com/500/600 这是一个提供猫片的网站,你只需要修改之后的两个数字就可以获取相应宽高比的小猫图片。

现在要将这张图片下载到本地:

import urllib.request
url = 'http://placekitten.com/500/600'
urllib.request.urlretrieve(url, 'cat_img.jpg')

示例2:下载新浪财经年报PDF 如http://vip.stock.finance.sina.com.cn/corp/view/vCB_AllBulletinDetail.php?stockid=000048&id=712408

import urllib.request
url = 'http://file.finance.sina.com.cn/211.154.219.97:9494/MRGG/CNSESZ_STOCK/2011/2011-4/2011-04-26/712408.PDF'
urllib.request.urlretrieve(url, '712408.pdf')

2、请求获取bytes后自己建文件存

还是前面的示例1,可以写成:

import requests
url = 'http://placekitten.com/500/600'
r = requests.get(url).content #这里也可以用urllib.request.urlopen()方法
f = open('cat_img.jpg', 'wb')
f.write(r)
f.close()

这样写自然是不如之前的一行代码解决问题来的方便,但是这样有一个好处,就是方便解决网络请求的问题。尤其是使用requests库时,无论是添加headers还是添加proxies,都十分方便。

举个栗子。各家爬虫文章最喜欢写的入门网站,妹子图(排第二的可能是煎蛋?),现在新加了反盗链的措施,说白了就是要验证请求头中的Referer字段。这是如果直接用urlretrieve就会获取到这样的结果:

于是我们需要这么来做:

import requests
headers = {'Referer': 'http://www.mzitu.com/'}
url = 'http://i.meizitu.net/2015/12/05m01.jpg'
r = requests.get(url, headers=headers).content
f = open('mzitu.jpg', 'wb')
f.write(r)
f.close()

3、解决urlretrieve添加headers的问题

前面的方法2中说到,urlretrieve不方便添加headers,但是并不是不能添加。如果一定要用的话,就需要构建opener。

import urllib.request
url = 'http://i.meizitu.net/2015/12/05m01.jpg'
opener=urllib.request.build_opener()
opener.addheaders = [('Referer', 'http://www.mzitu.com/')]
urllib.request.install_opener(opener)
urllib.request.urlretrieve(url, 'mzitu.jpg')

一般来说大概就是这些问题了。常用到的可以写成函数,以便以后调用。还有一个问题就是,在具体拼接储存路径时经常需要用到字符串的split方法,结合os.getcwd(),os.mkdir(),os.chdir()等。

最后回到最初的问题,为什么加了Referer都没有获取到图片呢?其实是个乌龙,我看了这位朋友的代码,其中有这么一行:

rsp = requests.get(url_real, headers).content

需要注意的是,这么写其实没有把headers添加进去。

我们可以用inspect来查看requests.get()方法所需的参数。

所以在添加headers时一定要写成:

rsp = requests.get(url_real, headers=headers).content

最后插句题外话,后台的自动回复又打开了,图片识别的接口有问题还在调,所以识图功能暂时用不了,会尽快想办法的。

原文发布于微信公众号 - 不二小段(rose-fun)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ChaMd5安全团队

NSCTF “表情包” 详细writeup

偶尔打了一下NSCTF,其中大家比较蒙蔽的有一题,叫“表情包”,是常见的颜文字。 ? 这种叫aaencode(可以把任意js编码成颜文字表情),然后在这里全选复...

44312
来自专栏mini188

openfire的组件(Component)开发

在之前的文章《Openfire阶段实践总结》中提到过一种openfire的扩展模式Compoent。本文将主要探讨对这种模式的应用与开发方法。 内部与外部组件介...

2568
来自专栏iOSDevLog

生意参谋 App 需求 分析 编码 GUI 交付 Licence

还有一个登录的问题,我这里用最简单的,获取 Chrome 的 cookie,放到请求头中。

1552
来自专栏Java架构

Java 10正式发布,最新特性全解读

1874
来自专栏happyJared

用Python统计你的简书数据

  说来也巧,之前有一次无意间留意到简书好像没有做文章总阅读量的统计(准确的说法应该叫展示),刚好最近有时间,趁这个机会就用Python写了这么个功能,既是学习...

1561
来自专栏腾讯Bugly的专栏

【MIG专项测试组】腾讯手机管家实战分析:内存突增是为神马?

应用版本升级后使用内存突增?如何跟踪?这次MIG专项测试组为大家分享内存问题跟踪实战过程! MIG专...

3364
来自专栏纯洁的微笑

一次内存溢出的排查经历

OutOfMemoryError 问题相信很多朋友都遇到过,相对于常见的业务异常(数组越界、空指针等)来说这类问题是很难定位和解决的。

1992
来自专栏北京马哥教育

Python 爬虫实战:股票数据定向爬虫

功能简介 目标: 获取上交所和深交所所有股票的名称和交易信息。 输出: 保存到文件中。 技术路线: requests—bs4–re 语言:python3.5 ...

39111
来自专栏申龙斌的程序人生

零基础学编程004:集成开发环境IDE

几天前介绍了《用在线编程环境快速上手》学习Python等编程语言,这种教学环境中的例子都非常简单,你不需要在自己的电脑中安装任何的软件,就可以马上动手学习Pyt...

3205
来自专栏友弟技术工作室

程序员必知必会的那些邪恶的脚本

朝圣 前言 程序员必须掌握一定的运维知识。本文通过一些邪恶,搞破坏的方式。教会你一些危险的脚本操作。 附赠 运维意识与运维规范 1.线上操作规范 ...

3447

扫码关注云+社区

领取腾讯云代金券