学到一招!Python下载大文件,哪种方式速度更快转载
原创点击上方“菜鸟学Python”,选择“星标”公众号
超级无敌干货,第一时间送达!!!
大家好,我是菜鸟哥。
通常,我们都会用 requests 库去下载,这个库用起来太方便了。
方法一
使用以下流式代码,无论下载文件的大小如何,Python 内存占用都不会增加:
def download_file(url):
local_filename = url.split(/)[-1]
# 注意传入参数 stream=True
with requests.get(url, stream=True) as r:
r.raise_for_status()
with open(local_filename, wb) as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
return local_filename
如果你有对 chunk 编码的需求,那就不该传入 chunk_size 参数,且应该有 if 判断。
def download_file(url):
local_filename = url.split(/)[-1]
# 注意传入参数 stream=True
with requests.get(url, stream=True) as r:
r.raise_for_status()
with open(local_filename, w) as f:
for chunk in r.iter_content():
if chunk:
f.write(chunk.decode("utf-8"))
return local_filename
iter_content [1] 函数本身也可以解码,只需要传入参数 decode_unicode = True 即可。
请注意,使用 iter_content 返回的字节数并不完全是 chunk_size,它是一个通常更大的随机数,并且预计在每次迭代中都会有所不同。
方法二
使用 Response.raw [2] 和 shutil.copyfileobj [3]
import requests
import shutil
def download_file(url):
local_filename = url.split(/)[-1]
with requests.get(url, stream=True) as r:
with open(local_filename, wb) as f:
shutil.copyfileobj(r.raw, f)
return local_filename
这将文件流式传输到磁盘而不使用过多的内存,并且代码更简单。
注意:根据文档,Response.raw 不会解码,因此如果需要可以手动替换 r.raw.read 方法
response.raw.read = functools.partial(response.raw.read, decode_content=True)
速度
方法二更快。方法一如果 2-3 MB/s 的话,方法二可以达到近 40 MB/s。
参考资料
[1]
iter_content: https://requests.readthedocs.io/en/latest/api/#requests.Response.iter\_content
[2]
Response.raw: https://requests.readthedocs.io/en/latest/api/#requests.Response.raw
[3]
shutil.copyfileobj: https://docs.python.org/3/library/shutil.html#shutil.copyfileobj
推荐阅读:
入门: 最全的零基础学Python的问题 | 零基础学了8个月的Python | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 | 从万众期待到口碑扑街!唐探3令人失望 | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏 | 九宫格 | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!| 再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|
年度爆款文案
-
1). 卧槽!Pdf转Word用Python轻松搞定 !
-
2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃
-
3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密
-
4). 80行代码!用Python做一个哆来A梦分身
-
5).你必须掌握的20个python代码,短小精悍,用处无穷
-
6). 30个Python奇淫技巧集
-
7). 我总结的80页《菜鸟学Python精选干货.pdf》,都是干货
-
8). 再见Python!我要学Go了!2500字深度分析 !
-
9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片
点阅读原文,看B站我的视频!
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除