从Curl命令下载文件到Python脚本不工作

1 人关注

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

curl命令是这样的。

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

I try different solutions:

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中打开它时出现了错误。

  • I write a txt file with a list of curl command line by line and then:
  • file = open('CURL_LIST.txt', 'r')
    lines = file.readlines()
    for line in enumerate(lines):
        os.system(line.strip())
    

    但它不能正常工作,而且我的输出与上述情况1相同。 现在我尝试使用urllib.request,但我不能很好地使用它。

    有人有建议吗? 谢谢你的帮助

    1 个评论
    sam
    当我尝试你的curl命令时,我得到了 curl: (60) SSL certificate problem: self signed certificate More details here: https://curl.haxx.se/docs/sslcerts.html
    python
    curl
    NicolA
    NicolA
    发布于 2022-04-07
    1 个回答
    Pitto
    Pitto
    发布于 2022-04-07
    已采纳
    0 人赞同
    该服务器上有一个自签名的证书,所以你得到一个警告(这也是你得到小文件的原因)。
    在下面的例子中,我禁用了证书检查,但这是 危险 只有在你了解风险并且对你来说没有问题的情况下,你才应该使用它(例如,你是example.it的所有者)。
    鉴于example.it的性质,我认为你只是为了学习而使用它,但请小心并阅读更多关于 自签名证书的风险 无论如何。
    从风险/安全的角度来看,类似问题的正确解决方案是不要连接到这样的服务器。

    一旦清楚了这一点,只是为了测试/学习的目的 我建议使用Python的request库(请注意 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中禁用cert检查(-k选项)。

    import shlex
    import subprocess
    TimeNum=1648710600000