V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
monetto
V2EX  ›  Python

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

  •  
  •   monetto · 2022-01-25 18:00:28 +08:00 · 3608 次点击
    这是一个创建于 1034 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    13 条回复    2022-01-26 16:29:14 +08:00
    imldy
        1
    imldy  
       2022-01-25 18:05:08 +08:00
    有些链接也没有显示下载进度吧,仅会显示已下载大小。
    wget 和 curl 也不支持?或者类似的,没必要非 aria2 吧
    ipwx
        2
    ipwx  
       2022-01-25 18:20:22 +08:00
    分类讨论,特殊处理。。。。
    ch2
        3
    ch2  
       2022-01-25 18:22:58 +08:00
    ->有的 Response 不存在 Content-Length
    流式下载你只能按提前知道的文件大小去推测进度,如果不知道那就显示一下当前已下载的大小替代进度条
    ->下载进度和断点续传
    一般来说是通过 range 请求头指定要下载的文件分片实现的,多线程下载跟断点续传也是这个方法
    fgwmlhdkkkw
        4
    fgwmlhdkkkw  
       2022-01-25 18:26:47 +08:00
    Content-Range
    还有
    Transfer-Encoding: chunked
    SleipniR
        5
    SleipniR  
       2022-01-25 19:00:14 +08:00   ❤️ 1
    tqdm, clint.textui.progress, click.progressbar
    black11black
        6
    black11black  
       2022-01-25 19:58:19 +08:00
    话说问个题外话,idm 下载文件的时候会提示有的文件支持断点续传,有的文件不支持,从 http 角度讲后端如何实现断点续传的?
    yaleyu
        7
    yaleyu  
       2022-01-25 21:26:27 +08:00
    @black11black IDM 很神奇,不知道用了什么技术,在不支持 Range 的下载点(比如各大网赚盘)也可以实现分片下载。
    ospider
        8
    ospider  
       2022-01-25 21:33:21 +08:00
    我刚想说 system("aria2"),结果被你 ban 掉了
    hicdn
        9
    hicdn  
       2022-01-25 21:59:38 +08:00 via iPhone   ❤️ 1
    安装 curl 最省事
    black11black
        10
    black11black  
       2022-01-25 23:44:48 +08:00
    @yaleyu 支持 range 与不支持 range 怎么理解?
    2i2Re2PLMaDnghL
        11
    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
        12
    Dawnnnnnn  
       2022-01-26 12:56:44 +08:00   ❤️ 2
    可以看看支不支持 axel ,现在在 Python 里下载东西我都直接 os.system("axel -n 10 {url}"),多线程与断点续传都不用自己实现
    asmoker
        13
    asmoker  
       2022-01-26 16:29:14 +08:00
    @Dawnnnnnn 老哥这东西好使,感谢~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2943 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:20 · PVG 22:20 · LAX 06:20 · JFK 09:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.