Requests 模块方法总结

发布于 2024-07-19 01:37:33 字数 4725 浏览 10 评论 0

使用这个库之前,最好能掌握 http 协议相关知识。本文总结 requests 库常用的一些方法,以及我在实际开发相关工具时遇到的问题。

Requests 库介绍

如果需要了解更多详细内容和用法,请点击 这里 ,查看官方 API 文档。

Requests 是一个非常强大的基于 http 协议的 python 库(package)。到目前为止,主要应用在以下几个方面:

  • 简单爬虫工具,构造 http get 报文向指定网站 api 接口请求数据。然后对数据进行处理,得到我们需要的有价值的数据。(项目:网评分析工具)
  • 通过对产品接口进行自动化配置。公司产品基于 web 界面提供用户配置界面。配置信息通过 http post 报文写入产品后台。可以通过构造 post 报文,实现通过产品的接口对产品进行配置。(项目:产品的自动化配置)
  • 接口测试和白盒测试。当前公司产品接口和白盒测试能力构建较少,所以这一块目前我实际项目经验也不多。

安装

pip3 install requests

快速上手

get 请求报文

通过 get 方法获取某个网页。以下代码 r 为网站响应的 response 对象。

import requests

r = requests.get('https://api.github.com/events')

查看 url 链接

r.url

查看 http 响应码

r.status_code

查看服务器响应的头部,r.headers 返回的数据类型为字典类型

>>> r.headers
>>> r.headers['content-type']
'application/json; charset=utf-8'
>>> r.headers.get('content-type')

读取服务器响应的内容

r.text

查看响应文本的编码格式

r.encoding = 'utf-8'

二进制响应内容

r.content

json 响应内容,如果处理失败,则会跑出异常

r.json()

原始响应内容

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

传递 url 参数

>>> payload = {'key1':'value','key2':'value2'}
urllib.urlencode(payload)  ==
>>> r = requests.get('http://httpbin.org/get', params=payload)
>>> r.url
http://httpbin.org/get?key1=value1&key2=value2   

异常状态响应码,抛出异常方法

>>> r = requests.get('http://httpbin.org/status/404')
>>> r.status_code
404
>>> r.raise_for_status()
定制请求报头
>>> url = 'https://api.github.com/some/endpoint'
>>> headers = {'user-agent': 'my-app/0.0.1'}
>>> r = requests.get(url, headers=headers)

所有的 header 值必须是 string 、bytestring 或者 unicode。

post 请求报文

>>> payload = {'key1':'value1','key2':'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)

超时设置

timeout 参数给出服务器应答的超时时间,建议在实际生产代码中应用。

如果超过超时时间,服务器没有响应。将抛出异常。

>>> r = requests.get('http://github.com', timeout=0.001)

关于重定向

Requests 会自动处理所有重定向。

当然你可以禁用重定向功能,allow_redirects 参数赋值为 False 即可禁用。

>>> r = requests.get('http://github.com', allow_redirects=False)

cookie

Cookie 是解决 HTTP 无状态性的有效手段,服务器可以设置或读取 Cookie 中所包含的信息。当用户登录后,服务器会发送包含登录凭据的 Cookie 到用户浏览器客户端,而浏览器对该 Cookie 进行某种形式的存储(内存或硬盘)。用户再次访问该网站时,浏览器会发送该 Cookie(Cookie 未到期时)到服务器,服务器对该凭据进行验证,合法时使用户不必输入用户名和密码就可以直接登录。

高级用法

构建 session

会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。

>>> s = requests.Session()
>>> s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
>>> r = s.get("http://httpbin.org/cookies")
>>> r.text

但是就算使用会话对象后,方法级别的参数也不会被跨请求保持。

>>> s = requests.Session()
>>> r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
>>> print(r.text)
# '{"cookies": {"from-my": "browser"}}'

>>> r = s.get('http://httpbin.org/cookies')
>>> print(r.text)

问题总结

这里主要总结一下,使用 requests 库可能会遇到的一些问题以及给出解决方案。

1、response 对象的内容,注意几个方法读取内容的数据类型。

# 二进制,eg:b'test'
r.content
# 字符,eg:'test'
r.text
# json 格式
r.json()
# raw,原始套接字响应数据,参数设置 stream=True
r.raw

2、网络连接问题,将抛出 connectionError 错误。

解决办法:通过浏览器手动访问,检测网络连接是否通畅

3、超时问题,TimeOut 异常。

解决办法:服务器响应超时,增加 timeout 参数,并给定参数值。

4、请求过于频繁,无法建立更多连接,抛出异常。

原因分析:发出的网络请求比较频繁,requests 内置的 urllibs3 不能及时的为我们断开连接,于是就有了以上报错。

解决办法:a、stream 设置为 False 或直接读取 Response 对象的 content 属性。b、在代码中手动关闭连接。

response = requests.post(url, data=data, headers=headers,stream=False)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

原野

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文