这知识点真细,Python获取HTTP响应头和响应体 Y3

举报
梦想橡皮擦 发表于 2022/04/18 16:00:40 2022/04/18
【摘要】 📢📢📢📢📢📢哈喽!大家好,我是 【梦想橡皮擦】,10 年产研经验,致力于 Python 相关技术栈传播 💗 ⛳️ 实战案例场景这篇博客涉及的知识点很小,就是为了获取 HTTP 响应数据,其中包括响应头和响应体两部分内容,如果配合开发者工具查阅,本文对应的数据查看地址如下所示:案例目标是使用 Python 读取这些信息,本文用到的模块是 requests,特点是简洁,实用。案例中...

📢📢📢📢📢📢
哈喽!大家好,我是 【梦想橡皮擦】,10 年产研经验,致力于 Python 相关技术栈传播 💗

⛳️ 实战案例场景

这篇博客涉及的知识点很小,就是为了获取 HTTP 响应数据,其中包括响应头和响应体两部分内容,如果配合开发者工具查阅,本文对应的数据查看地址如下所示:

案例目标是使用 Python 读取这些信息,本文用到的模块是 requests,特点是简洁,实用。

案例中使用的站点是 example.com,一个专门用于我们爬虫学习练手的站点。

获取服务器响应内容的代码非常简单,如下所示:

import requests

res = requests.get('https://example.com/')
print(res)

得到的结果是响应对象 <Response [200]>

⛳️ 可获取的响应头

上文中的 res 是响应对象,先通过 dir 函数,查阅一下其包含的属性和方法。

import requests

res = requests.get('https://example.com/')
print(dir(res))

删除私有内容,得到如下结果集:

 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'next', 'ok
', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url'

其中只读属性为:

  • apparent_encoding:chardet 库编码;
  • content:响应内容(字节类型);
  • is_permanent_redirect:是否为永久定向;
  • links:解析链接;
  • ok:当 status_code 小于 400,为 True;
  • text:响应内容(unicode 类型);

上述内容可以直接进行代码测试获取:

import requests

res = requests.get('https://example.com/')

print(res.apparent_encoding)  # ascii
# print(res.text)
# print(res.content)
print(res.is_permanent_redirect)  # False
print(res.is_redirect)  # False
print(res.links)  # {}
print(res.next)  # None
print(res.ok)  # True

代码中被我注释掉的 res.textres.content 就是获取网页请求体内容,区别可以简单理解为文本和二进制的区别。

除上述内容外,我们还可以获取网页编码等内容:

import requests

res = requests.get('https://example.com/')

print(res.headers)
print(res.cookies)
print(res.elapsed)  # 响应时间
print(res.encoding)  # UTF-8 编码
print(res.history)
print(res.raw)
print(res.reason)  # OK 请求结果
print(res.request)
print(res.status_code)  # 200 状态码
print(res.url)  # 请求地址

上述代码中的 res.headers 就已经实现本文标题提及的响应头内容,运行代码会输出如下数据。

{'Content-Encoding': 'gzip', 'Accept-Ranges': 'bytes', 'Age': '545172', 'Cache-Control': 'max-age=604800', 'Content-Type': 'text/html; charset=UTF-8', 'Date': 'Fri, 01 Apr 2022 14:16:57 GMT', 'Etag': '"3147526947"', 'Expires': 'Fri, 08
 Apr 2022 14:16:57 GMT', 'Last-Modified': 'Thu, 17 Oct 2019 07:18:26 GMT', 'Server': 'ECS (sab/5784)', 'Vary': 'Accept-Encoding', 'X-Cache': 'HIT', 'Content-Length': '648'}

该内容以字典形式呈现,可以直接对其中的值进行提取,所以一般看到的代码如下所示:

res.headers['Content-Encoding']

获取头部信息除了直接用字典的键访问意外,还可以使用 get() 方法获取,代码如下所示:

import requests

res = requests.get('https://example.com/')

print(res.headers.get('Content-Encoding'))

使用 get() 方法的好处就是可以设置一个默认值,当目标字典中没有对应键值时,可以返回。

print(res.headers.get('Content-Encoding_CA',None))

前文的代码中还提及了 res.status_code,即网页状态码,在编写代码时,可以将响应状态码与 requests 模块提供的内置响应状态码做对比,查看请求是否成功。

内置的状态码如下所示:

print(requests.codes.ok)
print(requests.codes.all_good)

输出结果都为 200。

📣📣📣📣📣📣
🌻 本文如果发现错误,欢迎在评论区中指正哦 💗

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。