使用pycurl获取回复的头部值

2 投票
3 回答
5476 浏览
提问于 2025-04-17 20:18

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

我该如何从Python中获取Location头的值呢?

3 个回答

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

这样会让你的生活轻松很多。想了解更多,可以阅读文档

2

简单来说,这里讲的是很多自定义函数和注册回调函数的事情。我们可以逐步分析一下curl的详细输出。首先,关于连接的部分,如果你提供自己的 CURLOPT_OPENSOCKETFUNCTION,大部分内容都可以填充进去。

接下来,请求头是一些你事先就知道的内容,你可以随意打印出来。对于进度条,有个 CURLOPT_PROGRESSFUNCTION,它允许你注册一个回调函数,大约每秒更新一次进度。

你还可以注册一个响应头写入函数 (CURLOPT_HEADERFUNCTION),这样你就可以用它来捕获和/或显示响应头。

另外,你可以使用 CURLOPT_DEBUGFUNCTION 来注册回调函数,以获取你发送的头信息、收到的响应等信息。

撰写回答