Python 使用pycurl获取reply的头值

Python 使用pycurl获取reply的头值,python,pycurl,verbose,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()

我想知道在使用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

我希望恢复回复中“Location”头的值

尝试使用curl时,可以在详细输出中看到此值:

[... Curl output ...]
> GET XXXXXXXXX
[... Request ...]
[... Curl output ...]
< HTTP/1.1 302 Found
[... Other headers ...]
< Location: YYYYYYYYYYYYYYY
[... Rest of reply ...]
[…卷曲输出…]
>获取XXXXXXXX
[…请求…]
[…卷曲输出…]
找到

如何从python中恢复
位置
头的值?

如果必须使用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...
从中了解更多信息

您也可以使用请求而不是pycurl

虽然这可能不可能,也不能直接回答您的问题,但我建议您使用,而不是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)

这会让你的生活更轻松。通过

了解更多信息本质上是许多自定义函数和注册回调函数。让我们逐段查看curl的详细输出。首先,如果您提供自己的
CURLOPT_OPENSOCKETFUNCTION
,则大部分连接信息都可以填写

接下来,请求头可以是您提前知道的内容,并且可以按您喜欢的方式打印出来。对于进度条,有一个
CURLOPT_PROGRESSFUNCTION
,它允许您注册一个回调,以便“大约每秒”更新进度

您还可以注册一个响应头写入函数(
CURLOPT_HEADERFUNCTION
),然后使用该函数捕获和/或显示响应头


或者,您可以使用注册回调来获取发送的标题信息、获取响应等。

非常感谢:)我能够使用CURLOPT_DEBUGFUNCTION解决问题。等等,当pycurl专门为标题提供回调时,为什么要使用
CURLOPT_DEBUGFUNCTION
,我一直在使用curl的C绑定:-)在python中,我通常也会使用
请求
,我也不知道为什么会被否决。我可能会建议使用而不是/以及
请求
,因为这是一个小得多的更改,但是……除此之外,我看不到任何改进,更不用说投反对票了。从我这里得到肯定+1。(被接受的答案也是如此,不管谁投了反对票。)感谢
请求的提示!处理起来容易多了。
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