大家好,今天给大家分享一个使用 Python 下载图片的几个方法。
也许,平常我们下载一张图片,直接右击保存就可以了,可大家有没有想过,如果我们要下载 10000 张图片呢?可能代码解决就非常 cool 了。废话少说,直接开撸。
方法一
from urllib.request import urlretrieve
# 图片的地址
img_url = 'http://img.mp.itc.cn/upload/20170328/0a4a0b04a20d48faab1a58d920ea0704_th.jpeg'
# 两个参数,一个是图片地址;一个是图片名
urlretrieve(img_url, 'hmbb01.png')
这里我用的模块 urllib
,如果你了解 Python2 就会知道,Python2 模块中有一个 urllib2
模块,如今,这个模块已经被合并到了 urllib
中,叫做 urllib.request 。这样,看起来就很简洁了,符合 Python 语言的特点。
方法二
import requests
img_url = 'http://img.mp.itc.cn/upload/20170328/0a4a0b04a20d48faab1a58d920ea0704_th.jpeg'
t = requests.get(img_url, stream=True)
with open('hmbb02.png', 'wb') as f:
for chunk in t.iter_content(chunk_size=32):
f.write(chunk)
这里使用了 requests
模块里的 stream 参数,默认是 False ,不常用。我在写文章时发现的,讲真,自己也不明白,也去查阅了下资料。
当下载文件过大时,建议使用 stream 模式,默认是 False,如果我们下载的文件很大,它会立即开始下载文件并存放到内存中,进而会导致内存不足的情况。
当将 stream 设置成 True 时,它不会立即去下载,当你使用 iter_content(iter_lines)遍历内容或者访问内容属性时才开始下载。这样,就可以按需下载,防止内存不足的情况出现。不过,在文件没有下载之前,还是需要保持连接的。
使用 stream 模式之后,需要我们手动将其关闭,这里使用 with 语句,优雅的处理了这个问题。
方法三
import requests
img_url = 'http://img.mp.itc.cn/upload/20170328/0a4a0b04a20d48faab1a58d920ea0704_th.jpeg'
# 请求头,模拟浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36'
}
# timeout 2s得不到结果,则超时,不再请求
tem = requests.get(img_url, headers=headers, timeout=2)
with open('hmbb03.png', 'wb') as f:
f.write(tem.content)
直接用 requests
模块,请求图片地址,使用 with
open
将图片内容固化到本地,注意,因为是图片,这里使用的是 wb,与 w 是有区别的。首先,看字母,r 代表 read,是读文件; w 代表 write 是写文件。
w: 打开一个文件,只用于写入,如果文件存在则覆盖,如果不存在则新建;
wb: 以二进制的形式打开一个文件,用于读写,如果文件存在则覆盖,如果不存在则新建;
当然,除了上面介绍的 r,w,还有 a,追加(append)的意思,打开一个文件,存在则在后面继续追加,不会覆盖原来的文件,不存在则新建。