Python请求入门-GET请求
介绍
在很多 Web 应用中,通过 API 连接各种第三方服务是很正常的。 当您使用这些 API 时,您可以访问天气信息、体育比分、电影列表、推文、搜索引擎结果和图片等数据。 您还可以使用 API 向您的应用程序添加功能。 例如付款、日程安排、电子邮件、翻译、地图和文件传输。 如果您要自己创建其中任何一个,将花费大量时间,但使用 API,连接到一个并访问其功能和数据只需几分钟。
在本文中,我们将了解 Python Requests 库,它允许您在 Python 中发送 HTTP 请求。
由于使用 API 就是发送 HTTP 请求和接收响应,Requests 允许您在 Python 中使用 API。 我们将在此处演示语言翻译 API 的使用,以便您查看其工作原理的示例。
HTTP 请求快速概览
HTTP 请求是 Web 的工作方式。 每次您导航到网页时,您的浏览器都会向网页的服务器发出多个请求。 然后服务器响应呈现页面所需的所有数据,然后您的浏览器实际呈现页面以便您可以看到它。
通用过程是这样的:客户端(如使用请求的浏览器或 Python 脚本)将发送一些数据到 URL,然后位于 URL 的服务器将读取数据,决定如何处理它,并返回响应给客户。 最后,客户端可以决定如何处理响应中的数据。
客户端在请求中发送的部分数据是请求方法。 一些常见的请求方法是 GET、POST 和 PUT。 GET 请求通常仅用于读取数据而不对某些内容进行更改,而 POST 和 PUT 请求通常用于修改服务器上的数据。 因此,例如,Stripe API 允许您使用 POST 请求来创建新费用,以便用户可以从您的应用程序中购买东西。
注意: 本文将介绍 GET 请求,因为我们不会修改服务器上的任何数据。
当从 Python 脚本或 Web 应用程序内部发送请求时,开发人员可以决定在每个请求中发送什么以及如何处理响应。 因此,让我们首先向 Scotch.io 发送请求,然后使用语言翻译 API 来探索这一点。
安装 Python 请求
在我们做任何事情之前,我们需要安装这个库。 所以让我们继续使用 pip
安装请求。 如果您还没有虚拟环境,最好先创建一个虚拟环境。
pip install requests
我们的第一个请求
首先,让我们使用 Requests 来请求 Scotch.io 站点。 创建一个名为 script.py
的文件并将以下代码添加到其中。 在本文中,我们不会使用太多代码,因此当发生更改时,您只需更新现有代码而不是添加新行。
脚本.py
import requests res = requests.get('https://scotch.io') print(res)
所以这些代码所做的就是向 Scotch.io 发送一个 GET 请求。 这与您的浏览器为查看此页面而发送的请求类型相同,但唯一的区别是请求实际上无法呈现 HTML,因此您只会获取原始 HTML 和其他响应信息。
我们在这里使用 .get()
函数,但 Requests 允许您使用其他函数,例如 .post()
和 .put()
来发送这些请求。
您可以通过执行 script.py 文件来运行它。
python script.py
这就是你得到的回报:
状态码
我们可以做的第一件事是检查状态码。 HTTP 代码范围从 1XX 到 5XX。 您可能见过的常见状态代码是 200、404 和 500。
以下是每个状态代码含义的简要概述:
- 1XX - 信息
- 2XX - 成功
- 3XX - 重定向
- 4XX - 客户端错误(您犯了一个错误)
- 5XX - 服务器错误(他们犯了一个错误)
通常,当您执行自己的请求时,您正在寻找的是 200 年代的状态代码。
Requests 将 4XX 和 5XX 状态码识别为错误,因此如果返回这些状态码,则请求的响应对象评估为 False
。
您可以通过检查响应的真实性来测试请求是否成功响应。 例如:
脚本.py
if res: print('Response OK') else: print('Response Failed')
仅当返回 400 或 500 状态代码时,才会出现“响应失败”消息。 尝试将 URL 更改为一些废话,以查看响应失败并显示 404。
您可以通过添加以下内容直接查看状态代码:
脚本.py
print(res.status_code)
这将直接向您显示状态代码,以便您自己检查号码。
标头
您可以从响应中获得的另一件事是标题。 您可以使用响应对象上的 headers 字典来查看它们。
脚本.py
print(res.headers)
标头与请求一起发送并在响应中返回。 使用标头,因此客户端和服务器都知道如何解释在响应/响应中发送和接收的数据。
我们看到返回的各种标头。 很多时候你不需要直接使用标题信息,但如果你需要它就在那里。
内容类型通常是您可能需要的,因为它揭示了数据的格式,例如 HTML、JSON、PDF、文本等。 但是内容类型通常由请求处理,因此您可以访问返回的数据。
响应文本
最后,如果我们看一下 res.text
(这适用于文本数据,就像我们正在查看的 HTML 页面),我们可以看到构建 Scotch 主页所需的所有 HTML。 它不会被渲染,但我们看到它看起来像是属于 Scotch。 如果您将其保存到文件并打开它,您会看到类似于 Scotch 网站的内容。 在实际情况下,单个网页会发出多个请求来加载图像、脚本和样式表等内容,因此如果您只将 HTML 保存到文件中,它看起来不会像 Scotch 那样。 io 页面看起来像在您的浏览器中,因为只执行了一个请求来获取 HTML 数据。
脚本.py
print(res.text)
使用翻译 API
所以现在让我们继续做一些更有趣的事情。 我们将使用 Yandex Translate API 执行将某些文本翻译成不同语言的请求。
要使用 API,首先您需要注册。 注册后,转到 Translate API 并创建 API 密钥。 获得 API 密钥后,将其作为常量添加到文件中。 这是您可以执行所有这些操作的链接:https://tech.yandex.com/translate/
脚本.py
API_KEY = 'your yandex api key'
我们需要 API 密钥的原因是,每次我们想使用他们的 API 时,Yandex 都可以对我们进行身份验证。 API 密钥是一种轻量级的身份验证形式,因为它在发送时添加到请求 URL 的末尾。
要知道我们需要发送哪个 URL 来使用 API,我们可以查看 Yandex 的 文档。
如果我们看那里,我们将看到使用他们的 Translate API 翻译文本所需的所有信息。
当我们看到一个带有和号 (&)、问号 (?) 和等号 (=) 的 URL 时,您可以确定该 URL 用于 GET 请求。 这些符号指定与 URL 一起使用的参数。
通常方括号 ([]) 中的内容是可选的。 在这种情况下,格式、选项和回调是可选的,而请求的键、文本和语言是必需的。
因此,让我们添加一些代码以发送到该 URL。 您可以将我们创建的第一个请求替换为:
脚本.py
url = 'https://translate.yandex.net/api/v1.5/tr.json/translate' res = requests.get(url)
我们可以通过两种方式添加参数。 我们可以直接将它附加到 URL 的末尾,也可以让 Requests 为我们完成。 要做到后者,我们可以为我们的参数创建一个字典。 我们需要的三个项目是密钥、文本和语言。 让我们使用 API 密钥创建字典,文本为 'Hello'
,语言为 'en-es'
,这意味着我们要从英语翻译成西班牙语。
如果您需要知道任何其他语言代码,您可以查看here。 您正在寻找 639-1 列。
我们通过使用 dict()
函数并在我们的字典中传入我们想要的键和值来创建一个 params 字典。
脚本.py
params = dict(key=API_KEY, text='Hello', lang='en-es')
现在我们获取参数字典并将其传递给 .get()
函数。
脚本.py
res = requests.get(url, params=params)
当我们以这种方式传递参数时,Requests 会继续为我们将参数添加到 URL 中。
现在让我们为响应文本添加一个打印语句,并查看响应中返回的内容。
脚本.py
print(res.text)
我们看到三件事。 我们看到状态码,它与响应本身的状态码完全相同,我们看到了我们指定的语言,我们看到了列表中的翻译文本。 所以你应该看到翻译文本的 'Hola'
。
再次尝试使用 en-fr 作为语言代码,您现在应该会在响应中看到 'Bonjour'
。
脚本.py
params = dict(key=API_KEY, text='Hello', lang='en-fr')
让我们看一下这个特定响应的标头。
脚本.py
print(res.headers)
显然头部应该不同,因为我们正在与不同的服务器通信,但在这种情况下,内容类型是 application/json 而不是 text/html。 这意味着数据可以解释为 JSON。
当 application/json 是响应的内容类型时,我们可以让 Requests 将响应转换为字典和列表,以便我们可以更轻松地访问数据。
要将数据解析为 JSON,我们在响应对象上使用 .json()
方法。
如果您打印它,您会看到数据看起来相同,但格式略有不同。
脚本.py
json = res.json() print(json)
它之所以不同,是因为它不再是您从 res.text 获得的纯文本。 这次是字典的印刷版。
假设我们要访问文本。 由于现在这是一个字典,我们可以使用 text 键。
脚本.py
print(json['text'])
现在我们只看到那个键的数据。 在这种情况下,我们正在查看一个项目的列表,因此如果我们想直接在列表中获取该文本,我们可以通过索引访问它。
脚本.py
print(json['text'][0])
现在我们唯一看到的是翻译后的词。
所以当然,如果我们改变我们的参数,我们会得到不同的结果。 让我们将要翻译的文本从 Hello
更改为 Goodbye
,将目标语言更改回西班牙语,然后再次发送请求。
脚本.py
params = dict(key=API_KEY, text='Goodbye', lang='en-es')
尝试用不同的语言翻译较长的文本,看看 API 会给你什么响应。
翻译 API 错误案例
最后,我们来看一个错误案例。 并非一切都有效,因此我们需要知道何时会发生这种情况。
尝试通过删除一个字符来更改您的 API 密钥。 当您这样做时,您的 API 密钥将不再有效。 然后尝试发送请求。
如果你看一下状态码,你会得到:
脚本.py
print(res.status_code)
因此,当您使用 API 时,您需要检查事情是否成功,以便您可以根据应用程序的需要处理错误情况。
结论
这是我们学到的:
- HTTP 请求的工作原理
- 响应中可能出现的各种状态代码
- 如何使用 Python Requests 库发送请求和接收响应
- 如何使用语言翻译 API 翻译文本
- 如何将应用程序/JSON 内容响应转换为字典
如果您想做更多,请查看 这个列表 以查看可用的不同 API,并尝试将它们与 Python 请求一起使用。