写点什么

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

作者:梦想橡皮擦
  • 2022 年 5 月 20 日
  • 本文字数:1577 字

    阅读完需:约 5 分钟

⛳️ 实战案例场景

这篇博客涉及的知识点很小,就是为了获取 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) # Falseprint(res.is_redirect) # Falseprint(res.links) # {}print(res.next) # Noneprint(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。


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


用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
这知识点真细,Python获取HTTP响应头和响应体_5月月更_梦想橡皮擦_InfoQ写作社区