我有一个Python脚本可以抓取各种网站并从中下载文件。我的问题是,有些网站似乎使用PHP,至少这是我的理论,因为URL看起来像这样:https://www.portablefreeware.com/download.php?dd=1159
问题是我无法从这样的链接中获取任何文件名或结尾,因此无法保存文件。目前我只保存URL。
有没有办法找到链接后面的实际文件名?
这是我的精简下载代码:
r = requests.get(url, allow_redirects=True)
file = open("name.something", 'wb')
file.write(r.content)
file.close()
免责声明:我从来没有做过任何PHP的工作,所以请原谅任何不正确的术语或理解,我有。我很乐意学习更多虽然
5条答案
按热度按时间hujrc8aj1#
2w2cym1i2#
使用
allow_redirects=True
选项时,requests.get
会自动跟随响应的Location
头中的URL发出另一个请求,结果丢失了第一个响应的头,这就是为什么您在任何地方都找不到文件名信息的原因。您应该改为使用
allow_redirects=False
选项,以便可以将Location
标头(包含实际下载URL):这将输出:
演示:https://replit.com/@blhsing/TrivialLightheartedLists
然后,您可以向下载URL发出另一个请求,并使用
os.path.basename
获取要写入内容的文件的名称:0yycz8jy3#
您正在使用
requests
进行下载。这不适用于此类下载。请尝试
urllib
:llycmphe4#
您可以下载文件名从响应头中获取的文件。
下面是我的下载代码,其中包含进度条和块大小缓冲区:
1.要显示进度条,请使用tqdm.
pip install tqdm
1.在这种情况下,块写入用于在下载期间保存内存。
进度输出:
erhoui1w5#
重定向可以通过DNS分布式网络反弹任何地方。所以上面的示例答案显示https://www,但在我的情况下,他们将被解析到欧洲,所以我最快的本地源是作为
https://eu.diskinternals.com/download/Linux_Reader.exe
到目前为止,最简单的是,如果它的好不需要检查或刮原始 curl 第一
不去解决任何问题
curl -o 1159.tmp https://www.portablefreeware.com/download.php?dd=1159
然而,我知道在这种情况下,这不是预期的结果,所以下一个级别是
curl -I https://www.portablefreeware.com/download.php?dd=1159 |find "Location"
得到了其他人给出的结果
但这不是完整的情况因为如果我们反馈
curl.exe -K位置. txt
我们得到
因此嵌套重定向到
https://eu.diskinternals.com/download/Linux_Reader.exe
所有这些都可以通过命令行脚本在一两行中循环运行,但我不使用Python,因此您可能需要编写十几行代码来执行类似操作
并从帮助文件昨天额外更新(星期日,September 4,2022)链接
curl -O https://eu.diskinternals.com/download/Uneraser_Setup.exe