利用requests先写个最简单的下载器
什么是下载器我就不多说了,直接上代码,我以下载示意图为例
如果不懂requests是什么或者怎么使用,可参考真·从零开始使用Requests制作简单爬虫
# 加载requests库
import requests
# 示例图URL,是我公众号图片的地址
url = 'https://mmbiz.qpic.cn/mmbiz_jpg/KrUbaYdkiaBSKIhqlfLOia8deLy59zCg9CBv7hjIDt69nVbeypEhUYLPknziaicCFYlaWMm5S5eC4aOyx70wWRyrcQ/0?wx_fmt=jpeg'
# 使用get模式就可以了
r = requests.get(url)
# 将图片保存为picture.png。
# 由于r.content是byte类型,所以要用wb的模式进行写入
with open('picture.png', 'wb') as f:
f.write(r.content)
是不是很简单,下载一张图片就这么简单,但是我们要做的是做一个下载器,而不是一个简单的图片下载(很多教程也只是下载一个图片就结束了)
进一步思考
下载一张图片简单,是因为图片本身的大小比较小,所以可以用这种方式很快把一张图片下载完。让我们想一下,如果我们下载的东西是很大(假设为100M)或者下载的东西很多(下载100张图片)。我们来看一下,用这种方式的效果
# 加载requests库
import requests
# 示例图URL,是我公众号图片的地址
url = 'https://mmbiz.qpic.cn/mmbiz_jpg/KrUbaYdkiaBSKIhqlfLOia8deLy59zCg9CBv7hjIDt69nVbeypEhUYLPknziaicCFYlaWMm5S5eC4aOyx70wWRyrcQ/0?wx_fmt=jpeg'
# 创建一个有100个链接的列表,模拟要下载100张图片
urlList = [url]*100
n = 0
for i in urlList:
# 使用get模式就可以了
r = requests.get(i)
# 用str(n)+'picture.png'来创造出100张不同命名的图片
with open(str(n)+'picture.png', 'wb') as f:
f.write(r.content)
n += 1
通过模拟我们要下载100张图片,借此会发现,requests按顺序下载这样的会速度会很慢,我们是不是可以在同一时间下载多个图片呢?
接下来下载大文件百度网盘安装包
# 加载requests库
import requests
# 就试试下载百度网盘吧
url = 'http://wppkg.baidupcs.com/issue/netdisk/MACguanjia/BaiduNetdisk_mac_3.4.1.dmg'
# stream代表使用字节流方式下载
r = requests.get(url, stream = True)
# 因为使用的是字节流下载,所以可以每接收到1k的时候,就写入到文件中,这样就可以避免把整个文件都写入到内存后再写入文件。
with open('BaiduNetdisk_mac_3.4.1.dmg', 'wb') as f:
for chunk in r.iter_content(chunk_size = 1024):
f.write(chunk)
这次下载没有加入进度条,但是你也可以体会到下载速度很慢(没有到达网速上限),有没有什么方法可以加速?如果把下载文件拆成N份,同时下载的话,会不会更容易达到网速上限?
TO DO
为了让整个下载器更好用点,我们需要了解一下多进程、多线程以及协程的概念