纯 Python 如何 优雅可靠地下载文件

2022-01-25 18:00:28 +08:00
 monetto

背景: 家里的老手机越狱后支持安装 Python 2.7 ,但是不支持 aria2 ( iOS 5.1 系统)

就想利用起来挂着下载点东西。试了下 Requests 包确实可以当作下载库使用,但是显示下载进度和断点续传是个问题。

Google 了一下看见 有用 Content-Length 判断下载进度的,但是有的 Response 不存在 Content-Length... 那迅雷等软件是如何做到显示下载进度的呢?

3630 次点击
所在节点    Python
13 条回复
imldy
2022-01-25 18:05:08 +08:00
有些链接也没有显示下载进度吧,仅会显示已下载大小。
wget 和 curl 也不支持?或者类似的,没必要非 aria2 吧
ipwx
2022-01-25 18:20:22 +08:00
分类讨论,特殊处理。。。。
ch2
2022-01-25 18:22:58 +08:00
->有的 Response 不存在 Content-Length
流式下载你只能按提前知道的文件大小去推测进度,如果不知道那就显示一下当前已下载的大小替代进度条
->下载进度和断点续传
一般来说是通过 range 请求头指定要下载的文件分片实现的,多线程下载跟断点续传也是这个方法
fgwmlhdkkkw
2022-01-25 18:26:47 +08:00
Content-Range
还有
Transfer-Encoding: chunked
SleipniR
2022-01-25 19:00:14 +08:00
tqdm, clint.textui.progress, click.progressbar
black11black
2022-01-25 19:58:19 +08:00
话说问个题外话,idm 下载文件的时候会提示有的文件支持断点续传,有的文件不支持,从 http 角度讲后端如何实现断点续传的?
yaleyu
2022-01-25 21:26:27 +08:00
@black11black IDM 很神奇,不知道用了什么技术,在不支持 Range 的下载点(比如各大网赚盘)也可以实现分片下载。
ospider
2022-01-25 21:33:21 +08:00
我刚想说 system("aria2"),结果被你 ban 掉了
hicdn
2022-01-25 21:59:38 +08:00
安装 curl 最省事
black11black
2022-01-25 23:44:48 +08:00
@yaleyu 支持 range 与不支持 range 怎么理解?
2i2Re2PLMaDnghL
2022-01-26 09:43:51 +08:00
@black11black https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests

@yaleyu 先猜测一下是不是有非标准的 range 方式。比如 Youtube 就用了非标准的 range (采用 search 参数)
Dawnnnnnn
2022-01-26 12:56:44 +08:00
可以看看支不支持 axel ,现在在 Python 里下载东西我都直接 os.system("axel -n 10 {url}"),多线程与断点续传都不用自己实现
asmoker
2022-01-26 16:29:14 +08:00
@Dawnnnnnn 老哥这东西好使,感谢~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/830551

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX