2

我想知道一些在使用 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 ...]

如何Location从 python 中恢复标头的值?

4

3 回答 3

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...

从文档中了解更多信息。

你也可以使用 requests 代替 pycurl

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

它会让你的生活更轻松。通过阅读文档了解更多信息

于 2013-03-26T15:46:59.677 回答
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
于 2013-12-28T12:19:56.223 回答
2

本质上,很多自定义函数和注册回调函数。让我们分段浏览 curl 的详细输出。首先,如果您提供自己的CURLOPT_OPENSOCKETFUNCTION.

接下来,请求标头可以是您提前知道的内容,并且可以根据需要打印出来。对于进度条,有CURLOPT_PROGRESSFUNCTION,它允许您注册回调以“大约每秒一次”更新进度。

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

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

于 2013-03-26T15:50:01.897 回答