加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python Requests库使用指南

发布时间:2020-05-25 03:51:09 所属栏目:Python 来源:互联网
导读:本文为译文,原文链接 python-requests-library-guide本人博客: 编程禅师requests 库是用来在Python中发出标准的HTTP请求。 它将请求背后的复杂性抽象成一个漂亮,简单的API,以便你可以专注于与服务交互和在应用程序中使用数据。在本文中,你将看到 requests

本文为译文,原文链接 本人博客:

库是用来在Python中发出标准的HTTP请求。 它将请求背后的复杂性抽象成一个漂亮,简单的API,以便你可以专注于与服务交互和在应用程序中使用数据。

在本文中,你将看到 requests 提供的一些有用的功能,以及如何针对你可能遇到的不同情况来自定义和优化这些功能。 你还将学习如何有效的使用 requests,以及如何防止对外部服务的请求导致减慢应用程序的速度。

在本教程中,你将学习如何:

  • 使用常见的HTTP方法发送请求
  • 定制你的请求头和数据,使用查询字符串和消息体
  • 检查你的请求和响应的数据
  • 发送带身份验证的请求
  • 配置你的请求来避免阻塞或减慢你的应用程序

虽然我试图包含尽可能多的信息来理解本文中包含的功能和示例,但阅读此文需要对HTTP有基础的了解。

现在让我们深入了解如何在你的应用程序中使用请求!

requests

让我们首先安装 requests 库。 为此,请运行以下命令:

pip install requests

如果你喜欢使用 管理Python包,你可以运行下面的命令:

pipenv install requests

一旦安装了 requests ,你就可以在应用程序中使用它。像这样导入 requests :

import requests

现在你已经都准备完成了,那么是时候开始使用 requests 的旅程了。 你的第一个目标是学习如何发出GET请求。


(如GET和POST)决定当发出HTTP请求时尝试执行的操作。 除了GET和POST之外,还有其他一些常用的方法,你将在本教程的后面部分使用到。

最常见的HTTP方法之一是GET。 GET方法表示你正在尝试从指定资源获取或检索数据。 要发送GET请求,请调用 requests.get()

你可以通过下面方式来向GitHub的 发出GET请求:

>>> requests.get('https://api.github.com')

恭喜! 你发出了你的第一个请求。 接下来让我们更深入地了解该请求的响应。


Response 是检查请求结果的强有力的对象。 让我们再次发出相同的请求,但这次将返回值存储在一个变量中,以便你可以仔细查看其属性和方法:

>>> response = requests.get('https://api.github.com')

在此示例中,你捕获了 get() 的返回值,该值是 Response 的实例,并将其存储在名为 response 的变量中。 你现在可以使用 response 来查看有关GET请求结果的全部信息。

您可以从 Response 获取的第一部分信息是状态码。 状态码会展示你请求的状态。

例如,200 OK 状态表示你的请求成功,而 404 NOT FOUND 状态表示找不到你要查找的资源。 还有许多 ,可以为你提供关于你的请求所发生的具体情况。

通过访问 .status_code,你可以看到服务器返回的状态码:

>>> response.status_code
200

.status_code 返回 200 意味着你的请求是成功的,并且服务器返回你要请求的数据。

有时,你可能想要在代码中使用这些信息来做判断:

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

按照这个逻辑,如果服务器返回 200 状态码,你的程序将打印 Success! 如果结果是 404 ,你的程序将打印 Not Found.

requests 更进一步为你简化了此过程。 如果在条件表达式中使用 Response 实例,则在状态码介于 200400 之间时将被计算为为 True ,否则为 False

因此,你可以通过重写 if 语句来简化上一个示例:

if response:
    print('Success!')
else:
    print('An error has occurred.')

技术细节 : 因为 __ bool __()Response 上的 ,因此才成立。

这意味着重新定义了 Response 的默认行为,用来在确定对象的真值时考虑状态码。

请记住,此方法 不会验证 状态码是否等于 200 。原因是 200400 范围内的其他状态代码,例如 204 NO CONTENT304 NOT MODIFIED ,就意义而言也被认为是成功的响应。

例如,204 告诉你响应是成功的,但是下消息体中没有返回任何内容。

因此,通常如果你想知道请求是否成功时,请确保使用这方便的简写,然后在必要时根据状态码适当地处理响应。

假设你不想在 if 语句中检查响应的状态码。 相反,如果请求不成功,你希望抛出一个异常。 你可以使用 .raise_for_status()执行此操作:

import requests
from requests.exceptions import HTTPError

for url in ['https://api.github.com','https://api.github.com/invalid']:
try:
response = requests.get(url)

    # If the response was successful,no Exception will be raised
    response.raise_for_status()
except HTTPError as http_err:
    print(f'HTTP error occurred: {http_err}')  # Python 3.6
except Exception as err:
    print(f'Other error occurred: {err}')  # Python 3.6
else:
    print('Success!')</code></pre>

如果你调用 .raise_for_status(),将针对某些状态码引发 HTTPError 异常。 如果状态码指示请求成功,则程序将继续进行而不会引发该异常。

进一步阅读:如果你不熟悉Python 3.6的 ,我建议你使用它们,因为它们是简化格式化字符串的好方法。

现在,你对于如何处理从服务器返回的响应的状态码了解了许多。 但是,当你发出GET请求时,你很少只关心响应的状态码。 通常,你希望看到更多。 接下来,你将看到如何查看服务器在响应正文中返回的实际数据。

GET 请求的响应通常在消息体中具有一些有价值的信息,称为有效负载。 使用 Response 的属性和方法,你可以以各种不同的格式查看有效负载。

要以 格式查看响应的内容,你可以使用 .content

>>> response = requests.get('https://api.github.com')
>>> response.content
b'{"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"https://github.com/settings/connections/applications{/client_id}","authorizations_url":"https://api.github.com/authorizations","code_search_url":"https://api.github.com/search/code?q={query}{&page,per_page,sort,order}","commit_search_url":"https://api.github.com/search/commits?q={query}{&page,"emails_url":"https://api.github.com/user/emails","emojis_url":"https://api.github.com/emojis","events_url":"https://api.github.com/events","feeds_url":"https://api.github.com/feeds","followers_url":"https://api.github.com/user/followers","following_url":"https://api.github.com/user/following{/target}","gists_url":"https://api.github.com/gists{/gist_id}","hub_url":"https://api.github.com/hub","issue_search_url":"https://api.github.com/search/issues?q={query}{&page,"issues_url":"https://api.github.com/issues","keys_url":"https://api.github.com/user/keys","notifications_url":"https://api.github.com/notifications","organization_repositories_url":"https://api.github.com/orgs/{org}/repos{?type,page,sort}","organization_url":"https://api.github.com/orgs/{org}","public_gists_url":"https://api.github.com/gists/public","rate_limit_url":"https://api.github.com/rate_limit","repository_url":"https://api.github.com/repos/{owner}/{repo}","repository_search_url":"https://api.github.com/search/repositories?q={query}{&page,"current_user_repositories_url":"https://api.github.com/user/repos{?type,"starred_url":"https://api.github.com/user/starred{/owner}{/repo}","starred_gists_url":"https://api.github.com/gists/starred","team_url":"https://api.github.com/teams","user_url":"https://api.github.com/users/{user}","user_organizations_url":"https://api.github.com/user/orgs","user_repositories_url":"https://api.github.com/users/{user}/repos{?type,"user_search_url":"https://api.github.com/search/users?q={query}{&page,order}"}'

虽然 .content 允许你访问响应有效负载的原始字节,但你通常希望使用 等字符编码将它们转换为。 当你访问 .text 时,response 将为你执行此操作:

>>> response.text
'{"current_user_url":"https://api.github.com/user",order}"...}"}'

因为对 bytes 解码到 str 需要一个编码格式,所以如果你没有指定,请求将尝试根据响应头来猜测编码格式。 你也可以在访问 .text 之前通过 .encoding 来显式设置编码:

>>> response.encoding = 'utf-8' # Optional: requests infers this internally
>>> response.text
'{"current_user_url":"https://api.github.com/user",order}"...}"}'

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读