Python Requests 模块 - HTTP 请求

2024年8月29日 | 阅读 7 分钟

在本教程中,我们将学习 Python 请求模块,以及如何使用 Python 请求库处理请求。我们还将讨论请求的功能。最后,我们将学习如何针对不同情况优化和自定义这些功能。

引言

通常,我们会在网站上查找一些信息。或者我们可能想访问社交媒体账户、查看邮件、观看在线视频。我们通常会使用网络浏览器发送请求,网络服务器会返回所需的结果。要从互联网获取信息,我们需要通过网络浏览器发送请求

例如 - 我们在 Google 上搜索 Python 教程。然后请求会向 Google 服务器发送 HTTP 请求,服务器会返回带有状态码的搜索结果。

通信的启动主要有两个组成部分:客户端和服务器。我们使用 HTTP(超文本传输协议),它实现了客户端和服务器之间通过互联网的通信。

Python 提供了 requests 模块,它允许我们使用 Python 脚本发出这些请求。

Python 请求模块

requests 模块是在 Python 中发出 HTTP 请求的标准方式。它是 Python 最强大的工具,允许我们在网络上发送请求。它包含许多功能和方法来发送 HTTP 请求。发送请求的系统称为客户端,承载网络服务器的系统称为服务器。

在使用 requests 时,我们会遇到以下方法。

  • GET - 用于从服务器请求数据。
  • POST - 用于向服务器提交一些数据进行处理。

我们将在后面的文章中讨论更多相关内容。

Python request 模块包含许多简单的 API,这些 API 有助于处理这些请求。这些 API 具有许多功能,例如添加标头、发送自定义标头、通过 URL 传递参数等等。

安装

要开始使用 requests,第一步是使用以下命令在 Python 中安装 request 模块。

语法

我们还可以使用 Pipenv(Python 打包工具)来安装 request 模块。输入以下命令。

在文件中导入 requests 模块以检查是否成功安装。为此,请键入以下命令。

GET 请求

GET 请求是 Python requests 模块最通用的方法之一。它指定用户试图从指定资源检索数据。换句话说,它用于向 URL 发送请求。要调用 GET 请求,我们使用以下语法。

语法

说明

在上述方法中,url 参数是用户发送请求的特定网站的 URL。param 参数用于在字典中发送查询字符串,args 是多个命名参数之一。

当 GET 请求成功发送后,该方法将返回一个 requests.Response 对象。此对象保存从服务器收到的响应。我们可以将 get() 请求结果赋给变量。

此对象保存从服务器收到的响应。因此,我们可以将 get() 请求结果赋给变量。

发出 GET 请求

使用 requests 模块发出 HTTP 请求非常简单。

参数

  • content - 它返回响应的数据内容。
  • status_code - 它返回请求的状态。例如 - 200 OK 表示您成功发出请求,404 NOT FOUND 表示资源未找到。
  • cookies - 它用于获取一个包含我们从服务器获得的所有 cookie 的 CookieJar 对象。

以下是发出 GET 请求的代码。

示例 -

输出

ISO-8859-1
200
0:00:01.007097
https://tpointtech.cn/
[]
text/html;charset=ISO-8859-1

POST 请求

POST 方法用于使用 post() 方法发送信息。基本语法如下。

语法

参数

  • url - url 是一个强制参数,指示我们要将数据发送到的 URL。
  • data - 它指定一个字典、文件对象或元组,我们想将其发送到 URL。这是一个可选参数。
  • json - 这是要发送到 URL 的 JSON 对象。

POST 方法返回 requests.Response 对象。

状态码

状态码是我们发出 GET 或 POST 请求后获得的响应。状态码告知我们请求的状态。

响应有许多可用的状态码。例如,当我们的请求成功时,状态码将是 200 或 201404 状态码是错误的请求或未找到我们正在寻找的页面。

我们还可以使用此信息在代码中做出决策。

有一点绝不能忘记,此方法不验证状态码是否等于 200。这是因为 200 到 400 范围内的其他状态码,例如 204 NO CONTENT,从某种意义上说也被认为是成功的。

例如 - 204 将表示请求成功,但消息正文中没有内容返回。

JSON 响应

JSON 代表 JavaScript 对象表示法,它是一种最流行的数据传输格式。JSON 数据可以很容易地被网络浏览器读取。数据以字典形式(键值对)存储。

如何将 JSON 转换为 Python 字典?

我们使用 r.json() 方法从 JSON 响应创建 Python 字典。让我们看以下示例。

代码

输出

{'args': {}, 'data': '', 'files': {}, 'form': {'password': '1234', 'username': 'mathew'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '29', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.25.1', 'X-Amzn-Trace-Id': 'Root=1-60b711e8-60f535db7df2f6a61f710e29'}, 'json': None, 'origin': '132.154.100.245', 'url': 'https://httpbin.org/post'}

存储在变量中

JSON 数据可以转换为 Python 字典,也可以存储在变量中。让我们理解以下示例。

代码

输出

{'password': '1234', 'username': 'mathew'}

请求头

我们可以使用 get() 方法创建自定义标头。HTTP 标头的字典通过 headers 参数传递给 get()

让我们理解下面的例子。

代码

输出

Text matches: [{'object_url': 'https://api.github.com/repositories/4290214', 'object_type': 'Repository', 'property': 'description', 'fragment': 'Requests + Gevent = <3', 'matches': [{'text': 'Requests', 'indices': [0, 8]}]}]

解释 -

在上面的代码中,Accepts 标头是应用程序可以处理的内容类型。例如,我们使用了标头值 application/vnd.github.v3.text-match+json,这是一个专有的 GitHub Accept 标头。标头的内容是 JSON 格式。

会话管理

请求会话管理是维护会话状态和持久化 HTTP 请求参数的过程。能够存储身份验证和凭据、Cookie 等。

Cookie 持久化

会话支持 Cookie 的程序化处理和管理。在会话中发出多个请求时,初始响应中收到的 Cookie 会被存储并随后自动包含在后续请求中。

连接持久化

会话还支持在向同一服务器发出多个请求时重用底层 TCP 连接。这通过避免为每个请求建立新连接的开销来提高性能。

共享参数

会话对象允许您设置应应用于该会话中所有请求的通用边界或标头。例如,您可以设置自定义标头,如客户端代理、接受编码或内容类型,这些标头将自动包含在通过会话发出的所有后续请求中。

认证

如果网站需要验证,会话对象提供了一种方便的方法,可以一次验证并在整个会话中保持验证状态。

其他重要的 HTTP 方法

除了 GET 和 POST 方法,HTTP 中还有一些重要的方法,包括 PUT、DELETE、HEAD、PATCH 和 OPTIONS。这些方法用于创建、读取、更新和删除 (或 CRUD) 操作。下面是 HTTP 方法的摘要表。

HTTP 方法CRUD整个集合特定项目
POST创建它在位置头中显示 201(已创建)并带有链接客户 ID。如果资源已存在,则显示 404(未找到)。
GET 读取它显示 200、客户列表、分页404,如果 ID 未找到或无效。404,如果 ID 未找到或无效。
PUT更新它显示 405,除非我们想要替换所有资源。404,如果 ID 未找到或无效。
PATCH更新它显示 405,除非我们想要修改整个集合本身。404,如果 ID 未找到或无效。
DELETE删除它显示 405,除非我们想要删除整个集合。404,如果 ID 未找到或无效。

最佳实践

  • 安全考虑,例如 SSL/TLS 证书确认和处理敏感数据
  • 使用流式传输技术高效处理大型响应
  • 优化需求性能,例如使用连接池或持久连接
  • 处理速率限制和实施回退策略
  • 通过有效利用功能、类和模块来编写干净有效的代码
  • 与最新版本的 Solicitations 库及其依赖项保持同步。

结论

我们已经讨论了 Python request 模块的基本细节,这些细节对于发出基本的服务器请求非常有用。

主要问题是 get() 方法不如 post() 方法安全,因为请求只能通过 URL 传递。因此,敏感密码可能被黑客窃取。

我们还提到了重要的 HTTP 方法以及如何使用自定义标头发送请求。如果您想了解更多关于请求模块的信息,可以访问其编写精良的请求文档