从 curl 命令下载文件到 python 脚本不工作

Download file from curl command into python script don't work

我想将复杂的 curl 命令发送到 python (3.9.7) 脚本以下载输出文件 .tif 我使用 TimeNum 变量是因为我想下载不同的文件并将 .tif 剪辑到个人感兴趣的区域(我想使用 for 循环)。

curl 命令是这样的:

curl --data '{"productType":"VMI","productDate":"1648710600000"}' -H "Content-Type: application/json" -X POST https://example.it/wide/product/downloadProduct——输出hrd2.tif

我尝试了不同的解决方案:

1)

import shlex
import subprocess

TimeNum=1648710600000

cmd ='''curl --data \'{"productType":"VMI","productDate":"%s"}\' -H "Content-Type: application/json" -X POST https://example.it/wide/product/downloadProduct --output %s.tif''' % (TimeNum,TimeNum)
args = shlex.split(cmd)
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()

下载成功,但输出占用 1KB 而不是大约 11MB,当我尝试在 Windows 中打开它时出现错误。

  1. 我逐行编写了一个包含 curl 命令行列表的 txt 文件,然后:
file = open('CURL_LIST.txt', 'r')
lines = file.readlines()
for line in enumerate(lines):
    os.system(line.strip())

但效果不佳,我的输出与上面的案例 1 相同。 现在我尝试使用 urllib.request 但我不能很好地使用它。

有人有建议吗? 提前感谢您的帮助

重要信息
该服务器上有一个 self-signed 证书,因此您会收到警告(这也是您获得小文件的原因)。
在下面的示例中,我禁用了证书检查,但这是 DANGEROUS 并且只有在您了解风险并且无论如何对您来说都可以的情况下才应该使用它(例如,您是 example.it).
鉴于 example.it 的性质,我假设您只是将它用于学习目的,但无论如何请小心并阅读有关 risks of self-signed certificates 的更多信息。
对于类似问题,从风险/安全的角度来看,正确的解决方案是不连接到这样的服务器。

弄清楚了,只是为了测试/学习 我建议使用 Python 的请求库(请注意 verify=False 禁用证书检查):

import requests

time_num = 1648710600000

headers = {
    # Already added when you pass json=
    # 'Content-Type': 'application/json',
}

json_data = {
    'productType': 'VMI',
    'productDate': time_num,
}

response = requests.post('https://example.it/wide/product/downloadProduct', headers=headers, json=json_data, verify=False)

with open(time_num + '.tif', 'wb') as f:
    f.write(response.content)

如果您更喜欢您发布的方法,也可以在 curl 中禁用证书检查(-k 选项):

import shlex
import subprocess

TimeNum=1648710600000

cmd ='''curl -k --data \'{"productType":"VMI","productDate":"%s"}\' -H "Content-Type: application/json" -X POST https://example.it/wide/product/downloadProduct --output %s.tif''' % (TimeNum,TimeNum)
args = shlex.split(cmd)
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()