在Python中为curl返回HTTP错误代码
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请求。你可以使用 urllib2
、pycurl
或者 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
就可以了。