使用pycurl获取回复的标头值

时间:2013-03-26 15:33:10

标签: python pycurl verbose

我想了解一些在使用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标头的值?

3 个答案:

答案 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