在Python中为curl返回HTTP错误代码

0 投票
2 回答
4526 浏览
提问于 2025-04-18 05:11
status, output = commands.getstatusoutput("curl -k -v --cookie cookie_name 'URL' -o filename")

上面是我的代码,我想要获取curl的HTTP响应代码。所以我尝试了这个选项 -w %{http_code}

status, output = commands.getstatusoutput("curl -k -v --cookie cookie_name -w %{http_code} 'URL' -o filename")

当我在Python脚本中运行它并打印状态时,什么都没有打印出来。有没有人能帮我解决curl返回代码的问题?我想尝试一些场景,比如当用户名或密码错误时获取状态,或者当网络主机无法访问时,或者内容没有正确下载时。

2 个回答

1

commands.getstatusoutput("cmd") 这个命令的意思是执行一个命令,并把输出的结果合并在一起,也就是把正常输出和错误输出都放在一起。curl 这个工具会把HTTP的状态码输出到正常的输出中。你可以使用 subprocess.check_output 来只获取正常输出的内容:

import shlex
from subprocess import check_output

DEVNULL = open(os.devnull, 'wb', 0)

curl_cmd = "curl -k --cookie ... -w %{http_code} -o filename 'URL'"
http_code = int(check_output(shlex.split(curl_cmd), stderr=DEVNULL))

正如其他人所说的,你其实不需要启动一个新的进程来在Python中发起HTTP请求。你可以使用 urllib2pycurl 或者 requests 这些库来实现,比如:

import urllib2
from shutil import copyfileobj

url = 'http://httpbin.org/status/418'
# to load cookies from file, you could use cookielib module
request = urllib2.Request(url, headers={'Cookie': 'cookie_name=value'})
try: # both `curl -k` and urllib2 do not verify ssl certificates
    response = urllib2.urlopen(request)
except urllib2.HTTPError as e:
    http_code = e.code
else:
    http_code = response.code
print(http_code)
if http_code == 200: # save to file
    with open('filename', 'wb') as output_file:
        copyfileobj(response, output_file)
response.close()
1

正如其他人所建议的,使用HTTP来进行curl调用会更好。requests库是最简单的方法:

import requests

data = {
    ...
}
r = requests.post(url, data=data)
print r.content

r.content里包含了响应的内容,如果你需要查看状态码,只需使用r.status_code就可以了。

撰写回答