wget与requests.get下载文件的差异及Dropbox下载异常问题
嘿,我来帮你搞定这个问题~
首先解决wget下载失败的核心问题
你用的Dropbox链接参数是dl=0,这个其实是Dropbox的网页预览链接,不是直接的文件下载地址!所以wget下载到的其实是预览页面的HTML内容,而非你想要的压缩包。
只需要把链接里的dl=0改成dl=1,就能得到直接下载链接,修改后的wget命令应该是:
wget https://www.dropbox.com/s/fgyso9fq40qp1vl/testfiles.tar.gz?dl=1 -O /tmp/data.dload-2
这样就能正常下载目标文件了。
至于你的requests代码为什么能“保存文件”,大概率是因为requests默认会自动跟随重定向,或者Dropbox对python-requests的User-Agent做了特殊处理,返回了实际文件内容,但更稳妥的方式还是把链接改成dl=1,避免后续出问题。
聊聊requests.get和wget在文件下载上的差异
这俩工具定位不同,在下载逻辑和功能上有不少区别:
请求与重定向处理:
requests默认开启自动重定向(allow_redirects=True),可以通过参数关闭;wget默认也会跟随重定向,但对于某些复杂跳转(比如JS跳转),wget处理起来不如requests灵活(requests可以结合解析工具获取真实下载链接)。流式下载与内存控制:
requests需要显式设置stream=True才能分块读取内容,配合shutil.copyfileobj把内容逐块写入磁盘,避免大文件占满内存;wget默认就是分块下载并写入磁盘,无需额外配置,对新手更友好。User-Agent与自定义Headers:
requests默认的User-Agent是python-requests/[版本号],wget的是Wget/[版本号]。部分网站会根据UA区分请求来源,返回不同内容(比如Dropbox的预览/下载跳转)。你可以给wget加--user-agent="python-requests/2.31.0"参数模拟requests的UA,也可以给requests手动设置headers伪装成浏览器。自带功能丰富度:
wget是专门的下载工具,自带断点续传(-c参数)、批量下载、递归爬取、限速(--limit-rate)、重试次数设置等功能,无需额外代码;requests是HTTP库,这些功能都需要自己写代码实现,比如断点续传要手动记录已下载字节数,下次请求时设置Range请求头。错误处理与重试:
wget默认会自动重试失败的请求,还能设置重试次数和间隔;requests需要借助requests.adapters.HTTPAdapter自定义重试逻辑,默认没有重试机制。
内容的提问来源于stack exchange,提问作者src




