前段时间,由于工作需要,一咬牙便充值了 XX网的会员,朋友得知后便一发不可自拔,不断发送链接让我帮忙下载,只好先将文件下载到本地,再发送过去,但一直这么搞着实麻烦,由于文件较大,下载和发送都需要时间,于是便寻思,能不能直接获取到文件的直链呢?如果可以的话,直接发送链接,让他自己去下载就好了!
First
鼠标右边复制链接
得到的是一个如下格式的链接:
https://www.xxxx.com/plus/download.php?open=2&id=1&uhash=a9a8c1cd9c908a44fd2f508e
在我这里通过浏览器访问之后,直接就开始下载文件了,发送朋友试试
果然没这么简单
Second
使用 Fiddler 抓包看看,先看一下响应体
神马东西都没有,再看一下响应头
原来经过了一次 302 重定向,而重定向的地址,嘿,这不就是我们一直寻找的文件直链嘛!
复制一下发给朋友,果然成功下载!
Third
但是每次都要抓包来查看地址也太麻烦了吧,于是便使用 python 来简化一下!
得益于 requests 库,很简单的几行代码就可以实现这个功能!
原以为已经可以和朋友装x了,但是就这么简单的几行代码,却一直没有打印直接结果,直到最后给我来了一个请求超时错误
于是便重新捋了一遍逻辑,
1. 请求右键复制到的下载链接
2. 自动跳转到文件直链
3. 重新发起请求
对额,这里会直接请求文件,但是这个文件足有 240MB,直接请求的话,大概率会请求超时了
这就尴尬了,我只需要链接的响应头,并不想请求它的实际内容
一番查阅资料,终于发现了 HTTP 的 HEAD 请求方式,完美契合我的需求,上一段官方说明:
9.4 HEAD
The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. The metainformation contained in the HTTP headers in response to a HEAD request SHOULD be identical to the information sent in response to a GET request. This method can be used for obtaining metainformation about the entity implied by the request without transferring the entity-body itself. This method is often used for testing hypertext links for validity, accessibility, and recent modification.
简单修改代码,完美解决问题
res = requests.head(url, headers=headers)
print(res.headers.get('location'))