我想了解一些在使用PyCurl发出请求时捕获和访问回复标题信息的方法:
c = pycurl.Curl()
c.setopt(c.URL,'MY_URL')
c.setopt(c.COOKIEFILE,'cookies')
c.setopt(c.COOKIE,'cookies')
c.setopt(c.POST,1)
c.setopt(c.POSTFIELDS,'MY AUTH VALUES')
c.setopt(c.VERBOSE, True)
b = StringIO.StringIO()
c.setopt(c.WRITEFUNCTION, b.write)
c.perform()
回复将是格式良好的JSON写入缓冲区b。
我希望在回复中恢复“位置”标题的值。
尝试使用curl时,可以在详细输出中看到此值:
[... Curl output ...]
> GET XXXXXXXXX
[... Request ...]
[... Curl output ...]
< HTTP/1.1 302 Found
[... Other headers ...]
< Location: YYYYYYYYYYYYYYY
[... Rest of reply ...]
如何从python中恢复Location
标头的值?
答案 0 :(得分:5)
如果必须使用PyCurl
然后你可以传递一个回调函数来获取标题信息:
# code...
# Callback function invoked when header data is ready
def header(buf):
# Print header data to stderr
import sys
sys.stderr.write(buf)
# Returning None implies that all bytes were written
# more code...
c.setopt(pycurl.HEADERFUNCTION, header)
# yet more code...
从the docs了解更多信息。
您也可以使用请求而不是pycurl
虽然这可能无法实现,但并未直接回答您的问题,但我建议您使用requests library代替pyCurl:
import requests
payload = {"key":"value"}
cookies = {"key":"value"}
r = requests.post('https://my.example.com', data=payload, cookies=cookies)
location = r.headers["Location"]
content = r.text
print(content)
它会让你的生活更轻松。点击reading the docs
了解更多资讯答案 1 :(得分:2)
基本上,很多自定义函数和注册回调函数。让我们逐步完成curl的详细输出。首先,如果您提供自己的CURLOPT_OPENSOCKETFUNCTION
,则可以填写关于连接的位。
接下来,请求标头可以是您提前知道的内容,也可以打印出您喜欢的内容。对于进度条,有CURLOPT_PROGRESSFUNCTION
,它允许您“大约每秒一次”注册回调以更新进度。
您还可以注册一个响应头写入功能(CURLOPT_HEADERFUNCTION
),然后您可以使用它来捕获和/或显示响应头。
或者,您可以使用CURLOPT_DEBUGFUNCTION
注册回调,以获取您发送的标头信息,获取回复等信息。
答案 2 :(得分:2)
import pycurl
import cStringIO
buf = cStringIO.StringIO()
URL = 'http://stackoverflow.com/questions/15641080/get-header-values-of-reply-using-pycurl'
c = pycurl.Curl()
c.setopt(c.URL, URL)
c.setopt(c.NOBODY, 1)
c.setopt(c.HEADERFUNCTION, buf.write)
c.perform()
header = buf.getvalue()
print header