Python 请求入门 – GET 请求

介绍

在很多 Web 应用中,通过 API 连接各种第三方服务是很正常的。使用这些 API 时,您可以访问天气信息、体育比分、电影列表、推文、搜索引擎结果和图片等数据。您还可以使用 API 向您的应用程序添加功能。这些示例包括付款、日程安排、电子邮件、翻译、地图和文件传输。如果您要自己创建其中任何一个,将花费大量时间,但使用 API,只需几分钟即可连接到一个并访问其功能和数据。

在本文中,我们将了解 Python 请求库,它允许您在 Python 中发送 HTTP 请求。

由于使用 API 是发送 HTTP 请求和接收响应,Requests 允许您在 Python 中使用 API。我们将在此处演示语言翻译 A​​PI 的使用,以便您可以查看其工作原理的示例。

HTTP 请求快速概览

HTTP 请求是网络的工作方式。每次导航到网页时,浏览器都会向网页服务器发出多个请求。然后服务器用呈现页面所需的所有数据进行响应,然后您的浏览器实际呈现页面以便您可以看到它。

通用过程是这样的:客户端(如浏览器或使用请求的 Python 脚本)将一些数据发送到 URL,然后位于 URL 的服务器将读取数据,决定如何处理它,并返回响应给客户。最后,客户端可以决定如何处理响应中的数据。

客户端在请求中发送的部分数据是请求方法。一些常见的请求方法是 GET、POST 和 PUT。GET 请求通常仅用于读取数据而不更改某些内容,而 POST 和 PUT 请求通常用于修改服务器上的数据。例如,Stripe API 允许您使用 POST 请求来创建新费用,以便用户可以从您的应用程序购买东西。

注意:本文将介绍 GET 请求,因为我们不会修改服务器上的任何数据。

当从 Python 脚本或 Web 应用程序内部发送请求时,开发人员可以决定在每个请求中发送什么以及如何处理响应。因此,让我们首先向 Scotch.io 发送请求,然后使用语言翻译 A​​PI 来探索这一点。

安装 Python 请求

在我们可以做任何事情之前,我们需要安装这个库。因此,让我们继续使用pip. 如果您还没有虚拟环境,最好先创建一个虚拟环境。

  • pip install requests

我们的第一个请求

首先,让我们使用 Requests 来请求 Scotch.io 站点。创建一个名为的文件script.py并向其中添加以下代码。在本文中,我们将不会使用太多代码,因此当发生变化时,您只需更新现有代码,而无需添加新行。

脚本文件
import requests

res = requests.get('https://scotch.io')

print(res)

所以这段代码所做的就是向 Scotch.io 发送一个 GET 请求。这与您的浏览器为查看此页面而发送的请求类型相同,但唯一的区别是请求实际上无法呈现 HTML,因此您只会获得原始 HTML 和其他响应信息。

我们正在使用.get()此功能,但请允许您使用其它功能,如.post().put()发送这些请求也是如此。

您可以通过执行 script.py 文件来运行它。

  • python script.py

这就是你得到的回报:
脚本以“Response 200”的输出运行

状态代码

我们可以做的第一件事是检查状态代码。HTTP 代码范围从 1XX 到 5XX。您可能见过的常见状态代码是 200、404 和 500。

以下是每个状态代码含义的快速概览:

  • 1XX – 信息
  • 2XX – 成功
  • 3XX – 重定向
  • 4XX – 客户端错误(您犯了一个错误)
  • 5XX – 服务器错误(他们犯了一个错误)

通常,您在执行自己的请求时要寻找的是 200 年代的状态代码。

请求识别 4XX 和 5XX 状态代码是错误,所以如果这些状态代码被返回,来自请求的响应对象评估为False

您可以通过检查响应的真实性来测试请求是否成功响应。例如:

脚本文件
if res:
    print('Response OK')
else:
    print('Response Failed')

Response 200 输出和 Response OK 的跟进

只有在返回 400 或 500 状态代码时才会出现消息“响应失败”。尝试将 URL 更改为一些废话以查看响应失败并显示 404。

您可以通过添加以下内容直接查看状态码:

脚本文件
print(res.status_code)

这将直接向您显示状态代码,以便您可以自己检查号码。

带有 404 的失败输出

标题

您可以从响应中获得的另一件事是标头。您可以使用响应对象上的标头字典来查看它们。

脚本文件
print(res.headers)

带有打印在标准输出中的标题的输出

标头与请求一起发送并在响应中返回。使用标头是为了让客户端和服务器都知道如何解释在响应/响应中发送和接收的数据。

我们看到返回的各种标头。很多时候你不需要直接使用标题信息,但如果你需要它就在那里。

内容类型通常是您可能需要的类型,因为它揭示了数据的格式,例如 HTML、JSON、PDF、文本等。但内容类型通常由请求处理,因此您可以访问返回的数据。

响应文本

最后,如果我们看一下res.text(这适用于文本数据,比如我们正在查看的 HTML 页面),我们可以看到构建 Scotch 主页所需的所有 HTML。它不会被渲染,但我们看到它看起来像是属于 Scotch 的。如果您将其保存到文件中并打开它,您会看到类似于 Scotch 站点的内容。在实际情况中,会为单个网页发出多个请求以加载图像、脚本和样式表等内容,因此如果您只将 HTML 保存到文件中,它看起来不会像 Scotch.io 页面的样子就像在您的浏览器中一样,因为只执行了一个请求来获取 HTML 数据。

脚本文件
print(res.text)

在命令行上打印 HTML 数据

使用翻译 API

所以现在让我们继续做一些更有趣的事情。我们将使用 Yandex Translate API 来执行将一些文本翻译成不同语言的请求。

要使用 API,首先您需要注册。注册后,转到 Translate API 并创建 API 密钥。获得 API 密钥后,将其作为常量添加到您的文件中。这是您可以执行所有这些操作的链接:https : //tech.yandex.com/translate/

脚本文件
API_KEY = 'your yandex api key'

我们需要 API 密钥的原因是 Yandex 可以在我们每次想要使用他们的 API 时对我们进行身份验证。API 密钥是一种轻量级的身份验证形式,因为它在发送时被添加到请求 URL 的末尾。

要知道我们需要发送哪个 URL 才能使用 API,我们可以查看Yandex文档

如果我们查看那里,我们将看到使用他们的 Translate API 翻译文本所需的所有信息。

使用 API 的请求语法

当我们看到带有与号 (&)、问号 (?) 和等号 (=) 的 URL 时,您可以确定该 URL 是用于 GET 请求的。这些符号指定与 URL 一起使用的参数。

通常方括号 ([]) 中的内容是可选的。在这种情况下,格式、选项和回调是可选的,而请求需要键、文本和语言。

因此,让我们添加一些代码以发送到该 URL。你可以用这个替换我们创建的第一个请求:

脚本文件
url = 'https://translate.yandex.net/api/v1.5/tr.json/translate'
res = requests.get(url)

我们可以通过两种方式添加参数。我们可以直接将它附加到 URL 的末尾,或者我们可以让 Requests 为我们做这件事。为了实现后者,我们可以为我们的参数创建一个字典。我们需要的三个项目是密钥、文本和语言。让我们使用 API 密钥、'Hello'文本和'en-es'lang创建字典,这意味着我们要从英语翻译成西班牙语。

如果您需要了解任何其他语言代码,您可以查看这里您正在寻找 639-1 列。

我们通过使用该dict()函数并传入我们想要的字典中的键和值来创建一个 params字典。

脚本文件
params = dict(key=API_KEY, text='Hello', lang='en-es')

现在我们获取参数字典并将其传递给.get()函数。

脚本文件
res = requests.get(url, params=params)

当我们以这种方式传递参数时,Requests 会继续为我们将参数添加到 URL 中。

现在让我们为响应文本添加一个打印语句并查看响应中返回的内容。

脚本文件
print(res.text)

带有输入值的输出字典

我们看到三件事。我们看到状态代码,它与响应本身的状态代码完全相同,我们看到我们指定的语言,我们看到列表中的翻译文本。所以你应该看到'Hola'翻译的文本。

使用 en-fr 作为语言代码再试一次,您'Bonjour'现在应该会在响应中看到

脚本文件
params = dict(key=API_KEY, text='Hello', lang='en-fr')

法语翻译文本

让我们来看看这个特定响应的标头。

脚本文件
print(res.headers)

输出中打印的标题

显然标题应该不同,因为我们正在与不同的服务器通信,但在这种情况下,内容类型是 application/json 而不是 text/html。这意味着数据可以解释为 JSON。

当 application/json 是响应的内容类型时,我们可以让 Requests 将响应转换为字典和列表,以便我们可以更轻松地访问数据。

要将数据解析为 JSON,我们使用.json()响应对象上的方法。

如果您打印它,您会看到数据看起来相同,但格式略有不同。

脚本文件
json = res.json()
print(json)



之所以不同,是因为它不再是您从 res.text 获得的纯文本。
这次是字典的印刷版。

假设我们要访问文本。由于这现在是一个字典,我们可以使用文本键。

脚本文件
print(json['text'])



现在我们只能看到那个键的数据。
在这种情况下,我们正在查看一个项目的列表,因此如果我们想直接在列表中获取该文本,我们可以通过索引访问它。

脚本文件
print(json['text'][0])

不带方括号的“Bonjour”

现在我们唯一看到的是翻译的词。

所以当然,如果我们改变参数,我们会得到不同的结果。让我们将要翻译的文本从更改HelloGoodbye,将目标语言更改回西班牙语,然后再次发送请求。

脚本文件
params = dict(key=API_KEY, text='Goodbye', lang='en-es')

“Adios”打印到输出

尝试用不同的语言翻译更长的文本,看看 API 会给你什么响应。

翻译 API 错误案例

最后,我们来看一个错误案例。一切并不总是有效,所以我们需要知道什么时候会发生。

尝试通过删除一个字符来更改您的 API 密钥。当您这样做时,您的 API 密钥将不再有效。然后尝试发送请求。

如果您查看状态代码,您会得到以下信息:

脚本文件
print(res.status_code)

403错误

因此,当您使用 API 时,您需要检查事情是否成功,以便您可以根据应用程序的需要处理错误情况。

结论

这是我们学到的:

  • HTTP 请求的工作原理
  • 响应中可能的各种状态代码
  • 如何使用 Python 请求库发送请求和接收响应
  • 如何使用语言翻译 A​​PI 翻译文本
  • 如何将应用程序/JSON 内容响应转换为字典

如果您想做更多,请查看此列表以查看可用的不同 API,并尝试将它们与 Python 请求一起使用。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁