如何使用PHP与Python从网站下载文件

pjngdqdw  于 2023-01-16  发布在  Python
关注(0)|答案(5)|浏览(190)

我有一个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的工作,所以请原谅任何不正确的术语或理解,我有。我很乐意学习更多虽然

hujrc8aj

hujrc8aj1#

import requests
import mimetypes

response = requests.get('https://www.portablefreeware.com/download.php?dd=1159')
content=response.content
content_type = response.headers['Content-Type']
ext= mimetypes.guess_extension(content_type)

print(content)# [ZipBinary]
print(ext)# .zip
print(content_type)#application/zip, application/octet-stream

with open("newFile."+ext, 'wb') as f:
  f.write(content)
  f.close()
2w2cym1i

2w2cym1i2#

使用allow_redirects=True选项时,requests.get会自动跟随响应的Location头中的URL发出另一个请求,结果丢失了第一个响应的头,这就是为什么您在任何地方都找不到文件名信息的原因。
您应该改为使用allow_redirects=False选项,以便可以将Location标头(包含实际下载URL):

import requests

url = 'https://www.portablefreeware.com/download.php?dd=1159'
r = requests.get(url, allow_redirects=False)
print(r.headers['Location'])

这将输出:

https://www.diskinternals.com/download/Linux_Reader.exe

演示:https://replit.com/@blhsing/TrivialLightheartedLists
然后,您可以向下载URL发出另一个请求,并使用os.path.basename获取要写入内容的文件的名称:

import os

url = r.headers['Location']
with open(os.path.basename(url), 'w') as file:
    r = requests.get(url)
    file.write(r.content)
0yycz8jy

0yycz8jy3#

您正在使用requests进行下载。这不适用于此类下载。
请尝试urllib

import urllib.request

urllib.request.urlretrieve(url, filepath)
llycmphe

llycmphe4#

您可以下载文件名从响应头中获取的文件。
下面是我的下载代码,其中包含进度条和块大小缓冲区:
1.要显示进度条,请使用tqdm. pip install tqdm
1.在这种情况下,块写入用于在下载期间保存内存。

import os

import requests
import tqdm
url = "https://www.portablefreeware.com/download.php?dd=1159"
response_header = requests.head(url)
file_path = response_header.headers["Location"]
file_name = os.path.basename(file_path)
with open(file_name, "wb") as file:
    response = requests.get(url, stream=True)
    total_length = int(response.headers.get("content-length"))
    for chunk in tqdm.tqdm(response.iter_content(chunk_size=1024), total=total_length / 1024, unit="KB"):
        if chunk:
            file.write(chunk)
            file.flush()

进度输出:

6%|▌         | 2848/46100.1640625 [00:04<01:11, 606.90KB/s]
erhoui1w

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
我们得到

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://eu.diskinternals.com/download/Linux_Reader.exe">here</a>.</p>
</body></html>

因此嵌套重定向到
https://eu.diskinternals.com/download/Linux_Reader.exe
所有这些都可以通过命令行脚本在一两行中循环运行,但我不使用Python,因此您可能需要编写十几行代码来执行类似操作

C:\Users\WDAGUtilityAccount\Desktop>curl -O https://eu.diskinternals.com/download/Linux_Reader.exe
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 44.9M  100 44.9M    0     0  3057k      0  0:00:15  0:00:15 --:--:-- 3640k

C:\Users\WDAGUtilityAccount\Desktop>dir /b lin*.*
Linux_Reader.exe

并从帮助文件昨天额外更新(星期日,September 4,2022)链接
curl -O https://eu.diskinternals.com/download/Uneraser_Setup.exe

相关问题