如何在Python中打印出http响应头

30

今天我需要从http头响应中检索数据。但由于我之前从未这样做过,而且在Google上也很难找到相关信息。因此,我决定在这里提问。

所以我的问题是:如何在Python中打印http头响应数据?我正在使用Python3.5与requests模块,并且还没有找到一种方法来实现这个。


你正在使用哪个Python模块来进行HTTP请求? - Anirudha Agashe
8个回答

23

更新: 根据发帖者的评论,只需要响应头。 如下面文档中所述,使用Requests模块更加容易:

我们可以使用Python字典查看服务器的响应头:

>>> r.headers
{
    'content-encoding': 'gzip',
    'transfer-encoding': 'chunked',
    'connection': 'close',
    'server': 'nginx/1.0.4',
    'x-runtime': '148ms',
    'etag': '"e1ca502697e5c9317743dc078f67693f"',
    'content-type': 'application/json'
}

特别是文档的注释:

这个字典很特别,因为它只为HTTP头而设计。根据RFC 7230,HTTP标头名称不区分大小写。

因此,我们可以使用任何大写或小写形式访问头部信息:

并继续解释了与RFC合规性相关的更多巧妙之处。

Requests文档中表示:

使用Response.iter_content将处理使用Response.raw直接处理时必须处理的大量内容。在流式下载时,上述方法是检索内容的首选和推荐方法。

文档提供以下示例:

>>> r = requests.get('https://api.github.com/events', stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

但也提供了实际操作的建议,例如通过重定向到文件等方式并使用不同的方法来完成:

使用Response.iter_content将处理许多您在直接使用Response.raw时必须处理的内容。


抱歉我的标题里说了"raw",但我实际上需要的只是头部响应数据,就像这样:HTTP/1.1 200 OK Server: nginx Date: Fri, 03 Jun 2016 14:12:48 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked - Naomi
请检查我的更新答案。使用“requests”应该很容易...;-) - Dilettant

12

以下是您如何使用requests库(Python3实现)仅获得响应头的方法:

import requests

url = "https://www.google.com"
response = requests.head(url)
print(response.headers) # prints the entire header as a dictionary
print(response.headers["Content-Length"]) # prints a specific section of the dictionary

使用.head()而不是.get()很重要,否则你将会像其他答案中提到的那样检索整个文件/页面。

如果您希望获取需要验证的URL,则可以将上述response替换为以下内容:

response = requests.head(url, auth=requests.auth.HTTPBasicAuth(username, password))

11

这样的东西怎么样:

import urllib2
req = urllib2.Request('http://www.google.com/')
res = urllib2.urlopen(req)
print res.info()
res.close();

如果您正在寻找标题中的特定内容:

For Date: print res.info().get('Date')

不是响应主体,我需要头部。 - Naomi
新增了一个答案。如果您有任何问题,请告诉我。 - NepCoder
2
这个答案有 Python3 版本吗? - etayluz

5

易用

import requests

site = "https://www.google.com"
headers = requests.get(site).headers
print(headers)

如果您需要特定内容

print(headers["domain"]) 

4

我正在使用urllib模块,以下是代码:

from urllib import request
with request.urlopen(url, data) as f:
    print(f.getcode())  # http response code
    print(f.info())     # all header info

    resp_body = f.read().decode('utf-8') # response body

2

非常简单,您可以输入

print(response.headers)

或者我的最爱
print(requests.get('url').headers)
also u can use

print(requests.get('url').content)



0
尝试使用req.headers,就可以获取响应头啦 ;)

1
请求和响应头不同。 - VMAtm

0
import pprint
import requests

res = requests.request("GET", "https://google.com")

pprint.PrettyPrinter(indent=2).pprint(dict(res.headers))

1
此答案已在低质量队列中进行了审核。以下是如何编写好的答案?的一些指南。仅有代码的答案不被认为是好的答案,并且很可能会因为对学习者社区不够有用而被投票降低或删除。这只是对您来说很明显。请解释它的作用,以及它与现有答案的不同之处/ 优点来自审核 - Trenton McKinney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接