Python教程-Python Requests 模块 - HTTP 请求
在这个教程中,我们将学习 Python 请求模块或者说如何使用 Python requests 库处理请求。我们还会讨论请求的特性。最后,我们将学习如何优化和自定义这些特性以适应不同的情况。
简介
通常,我们需要从网站上获取一些信息。或者我们可能想要访问社交媒体帐户,查看邮件,观看在线视频。我们通常使用网络浏览器发送请求,然后Web服务器从Web服务器返回所需的结果。要从互联网获取信息,我们需要通过网络浏览器发送请求。
例如 - 我们在 Google 上搜索 Python 教程。然后请求向 Google 服务器发送一个HTTP请求,服务器返回带有状态代码的搜索结果。
初始化通信的主要两个组成部分是客户端和服务器。我们使用HTTP(超文本传输协议),它允许客户端和服务器在互联网上进行通信。
Python 提供了 requests 模块,允许我们使用 Python 脚本进行这些请求。
Python Request 模块
requests 模块是 Python 中进行HTTP请求的标准方式。它是Python中最强大的工具,允许我们在Web上发送请求。它包括许多功能和方法来发送HTTP请求。发送请求的系统称为客户端,保存Web服务器的系统称为服务器。
在处理请求时,我们将遇到以下方法。
- GET - 用于从服务器请求数据。
- POST - 用于将一些数据提交到服务器进行处理。
我们稍后将更详细地讨论它们。
Python 的 requests 模块包括许多简单的API,有助于处理这些请求。这些API具有许多特性,如添加标头,发送自定义标头,通过URL传递参数等。
安装
要开始使用 requests,第一步是使用以下命令在Python中安装 requests 模块。
语法:
pip install requests
或
我们也可以使用 Pipenv(Python包装工具)来安装 requests 模块。输入以下命令。
pipenv install requests
导入 requests 模块到文件中,以检查是否已成功安装。要做到这一点,输入以下命令。
import requests
GET 请求
GET 请求是 Python requests 模块中最通用的方法之一。它指定用户正在尝试从指定资源检索数据。换句话说,它用于向URL发送请求。要调用 GET 请求,我们使用以下语法。
语法:
requests.get(url, param = {key:value}, args)
解释:
在上面的方法中,url 参数是用户发送请求的特定网站的URL。param 参数用于以字典形式发送查询字符串,args 是多个命名参数之一。
当成功发送 GET 请求时,该方法将返回一个requests.Response对象。这个对象保存了从服务器接收到的响应。我们可以将 GET 请求的结果分配给变量。
这个对象保存了从服务器接收到的响应。因此,我们可以将 GET 请求的结果分配给变量。
进行 GET 请求
使用 requests 模块进行HTTP请求非常容易。
参数:
- content - 返回响应数据的内容。
- status_code - 返回请求的状态。例如 - 200 OK 表示请求成功,404 NOT FOUND 表示资源未找到。
- cookies - 用于获取从服务器获取的所有Cookie的 CookieJar 对象。
以下是进行 GET 请求的代码。
示例 -
import requests
req = requests.get('http://www.javatiku.cn/')
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.javatiku.cn/
[]
text/html;charset=ISO-8859-1
POST 请求
POST 方法用于使用 post() 方法发送信息。以下是基本语法。
语法:
requests.post(url, data={key: value}, json={key: value}, args)
参数:
- url - URL 是指示我们要发送数据的URL的必需参数。
- data - 指定我们要发送到URL的字典,文件对象或元组。这是一个可选参数。
- json - 这是要发送到URL的JSON对象。
POST 方法返回 requests.Response 对象。
状态码
状态码是在进行 GET 或 POST 请求后获得的响应。状态码通知我们请求的状态。
响应中有许多可用的状态码。例如,当我们的请求成功时,状态码将是 200 或 201,404 状态码是无效请求或我们要查找的页面未找到。
我们还可以使用这些信息来做出代码中的决策。
if response.status_code == 200:
print('Success!')
elif response.status_code == 404:
print('Not Found.')
一个要记住的要点是,该方法不验证状态代码是否等于200。这是因为在200到400范围内的其他状态代码,如204 NO CONTENT,也被视为成功。
例如 - 204 表示成功的请求,但消息主体中没有内容返回。
JSON 响应
JSON 代表 JavaScript Object Notation,它是一种传输数据格式的最流行方式。JSON 数据可以被Web浏览器轻松阅读。数据以字典形式(键值对)存储。
如何将 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() 方法创建自定义头。HTTP头的字典通过头部参数传递给 get()。
让我们看看以下示例。
代码
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 头是应用程序可以处理的内容类型。例如,我们使用了头部值 application/vnd.github.v3.text-match+json,这是GitHub的专有 Accept 头。头部的内容是JSON格式。
会话管理
Requests 会话管理是维护会话状态和持久化HTTP请求参数的过程。它可以存储认证和凭据、Cookie等。
Cookie持久性
会话允许自动处理和管理Cookies。在会话中的多个请求中,初始响应中获得的Cookies会被存储,并自动包含在后续的请求中。
连接持久性
会话还允许在向同一服务器发出多个请求时重用底层TCP连接。这通过避免为每个请求建立新连接来提高性能。
共享参数
会话对象允许您设置应该应用于会话中的所有请求的公共参数或标头。例如,您可以设置自定义标头,如用户代理、接受编码或内容类型,这些标头将自动包含在通过会话进行的所有后续请求中。
身份验证
如果网站需要身份验证,会话对象提供了一种方便的方法来进行一次验证,并在会话中保持已验证状态。
其他重要的HTTP方法
除了GET和POST方法,HTTP中还有一些重要的方法,包括PUT、DELETE、HEAD、PATCH和OPTIONS。这些方法用于创建、读取、更新和删除(或CRUD)操作。下表总结了HTTP方法。
HTTP 方法 | CRUD | 整个集合 | 特定项 |
---|---|---|---|
POST | 创建 | 在位置标头上显示带有链接客户ID的201(已创建)。 | 如果资源已存在,将显示404(未找到)。 |
GET | 显示200、客户列表、分页 | 如果ID未找到或无效,则显示404。 | 如果ID未找到或无效,则显示404。 |
PUT | 更新 | 如果要替换每个资源,则显示405。 | 如果ID未找到或无效,则显示404。 |
PATCH | 更新 | 如果要修改整个集合本身,则显示405。 | 如果ID未找到或无效,则显示404。 |
DELETE | 删除 | 如果要删除整个集合,则显示405。 | 如果ID未找到或无效,则显示404。 |
最佳实践
- 安全性考虑,如SSL/TLS证书验证和处理敏感数据
- 有效处理大型响应,使用流式技术
- 优化请求执行,例如使用连接池或持久连接
- 处理速率限制并执行退避策略
- 使用函数、类和模块编写清晰和有效的代码
- 保持与最新版本的Requests库及其依赖项的更新。
结论
我们已经讨论了关于 Python 请求模块的基本细节,这将对进行基本的服务器请求非常有帮助。
主要问题是 get() 方法不如 post() 方法安全,因为请求只能通过URL传递。因此,敏感密码可能会被黑客窃取。