您的位置:

Python requests模块——HTTP 请求

在本教程中,我们将了解 Python requests模块,或者如何使用 Python 请求库处理请求。requests模块是 Python 中发出 HTTP 请求的标准方式。我们还将讨论请求的特征。最后,我们将学习如何针对不同情况优化和定制这些功能。

本教程包括以下主题。

  • 介绍
  • Python requests模块
  • 获取请求
  • 开机自检请求
  • 状态代码
  • JSON 回应
  • 请求标题
  • 消息正文
  • 其他重要的 HTTP 方法
  • 结论

让我们了解一下请求库的基本介绍。

介绍

一般来说,我们从网站上寻找一些信息。或者我们可能想进入社交媒体账户,查看邮件,观看在线视频。我们可能使用 web 浏览器发送请求,web 服务器从 web 服务器返回所需的结果。从网上获取信息,需要通过网页浏览器发送请求。

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

启动通信有两个主要组件——客户端和服务器。我们使用超文本传输协议(HTTP),这使得客户端和服务器之间能够通过互联网进行通信。

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

Python requests模块

它是 Python 中最强大的工具,允许我们在网络上发送请求。它包括许多发送 HTTP 请求的特性和方法。发送请求的系统被称为客户端,持有 web 服务器的系统被称为服务器。

在处理请求时,我们会遇到以下方法。

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

Python requests模块由许多简单的 API 组成,有助于处理这些请求。这些 API 有许多功能,如添加标题、发送自定义标题、用网址传递参数等。

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


pip install requests

或者

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


pipenv install requests

导入文件中的 requests 模块,检查它是否安装成功。


import requests

现在,我们准备开始学习 Python 请求的旅程。

获取请求

GET 和 POST 方法决定了用户在网页上的操作。GET 是 Python requests模块中最通用的方法之一。它指定用户正试图从指定的资源中检索数据。换句话说,它用于向一个网址发送请求。要调用 GET 请求,我们使用以下语法。


requests.get(url, param = {key:value}, args)

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

当获取请求成功发送后,该方法将返回一个请求。响应对象。此对象保存从服务器收到的响应。我们可以在变量中分配 get()** 请求结果。

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

发出获取请求

使用requests模块发出 HTTP 请求是一种非常简单的方法。下面是发出请求的代码。

这里,响应对象将存储信息。以下是基本属性。

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

示例-


import requests
req = requests.get('http://www.javatpoint.com/')

print(req.encoding) # returns 'utf-8'
print(req.status_code) # returns 200
print(req.elapsed) # returns datetime.timedelta(0, 1, 666890)
print(req.url) # returns 'https://edureka.co/'

print(req.history) 

print(req.headers['Content-Type'])

输出:

ISO-8859-1
200
0:00:01.007097
https://www.javatpoint.com/
[]
text/html;charset=ISO-8859-1 

开机自检请求

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

语法

requests.post(url,数据={key: value},json={key: value},args)

以下是重要的参数。

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

开机自检方法返回请求。响应对象。

状态代码

状态代码是我们在发出 get 或 POST 请求后得到的响应。状态代码通知我们请求的状态。

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

我们也可以使用这些信息在我们的代码中做出决定。


if response.status_code == 200:
    print('Success!')
elif response.status_code == 404:
    print('Not Found.')

如果状态码为 200,则打印成功,如果结果为 404,则程序打印未找到。

有一点永远不要忘记,这种方法不会验证状态代码是否等于 200。这是因为 200 到 400 范围内的其他状态代码,如 204 NO CONTENT,在某种意义上也被认为是成功的。

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

JSON 回应

JSON 代表 JavaScript 对象符号,这是一种最流行的数据格式传输方式。网页浏览器很容易读取 JSON 数据。数据以字典形式(键、值对)存储。

如何将 JSON 转换成 Python 字典?

我们使用 r.json()方法从 json 响应中创建一个 Python 字典。让我们看看下面的例子。

示例-


import requests
json_data = {'username':'mathew','password':'1234'}
r = requests.post('https://httpbin.org/post',data = json_data)

print(r.json())

输出:

{'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 字典,也可以存储在变量中。让我们理解下面的例子。

示例-


import requests
json_data = {'username':'mathew','password':'1234'}
r = requests.post('https://httpbin.org/post',data = json_data)
r_dictionary= r.json()
print(r_dictionary['form'])

输出:

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

请求标题

我们可以使用 get() 方法创建一个自定义标题。使用 headers 参数在 get() 中传递 HTTP 头的字典。

让我们理解下面的例子。

示例-


import requests

response = requests.get(
    'https://api.github.com/search/repositories',
    params={'q': 'requests+language:python'},
    headers={'Accept': 'application/vnd.github.v3.text-match+json'},
)

json_result = response.json()
repo = json_result['items'][0]
print(f'Text matches: {repo["text_matches"]}')

输出:

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]}]}]

解释-

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

其他重要的 HTTP 方法

除了 GET 和 POST 方法之外,HTTP 中很少有基本的方法,包括 PUT、DELETE、HEAD、PATCH 和 OPTIONS。这些方法用于创建、读取、更新和删除(或 CRUD)操作。下面是 HTTP 方法的汇总表。

| HTTP 方法 | create, read, update, and delete | 整个集合 | 特定的物品 | | 邮政 | 创造 | 它显示了带有链接客户 id 的位置标题上的 201(已创建)。 | 如果资源已经存在,它显示 404(未找到)。 | | GETRead | 它显示 200,客户列表,分页 | 404、如果标识未找到或无效。 | | 放 | 更新 | 它显示 405,除非我们想替换所有资源。 | 404、如果标识未找到或无效。 | | 修补 | 更新 | 它显示 405,除非我们想修改整个集合本身。 | 404、如果标识未找到或无效。 | | 删除 | 删除 | 它显示 405,除非我们想删除整个集合。 | 404、如果标识未找到或无效。 |

消息正文

消息正文用于传递数据,而不是查询字符串中的参数。这些数据通过 POST、PUT 和不太常见的补丁传递。数据可以是字典、元组列表、字节或类似文件的对象。使用请求,您将把有效负载传递给相应函数的数据参数。

如果请求内容类型为application/x-www-form-URL encoded,数据将在字典中发送。


requests.post('https://httpbin.org/post', data={'key':'value'})

我们也可以使用元组列表发送相同的数据。


requests.post('https://httpbin.org/post', data=[('key', 'value')])

结论

我们已经讨论了 Python requests模块的基本细节,这将非常有助于进行基本的服务器请求。

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

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