【Requests库简介】:HTTP客户端速成——快速掌握Python Requests库
发布时间: 2024-12-07 14:01:00 阅读量: 13 订阅数: 18
Python-Crash-Course:只是另一个存储库
![Python安装与配置Requests库](https://res.cloudinary.com/practicaldev/image/fetch/s--F4o5bVIL--/c_imagga_scale,f_auto,fl_progressive,h_420,q_auto,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tuepqgpnkiq73s9w91cm.png)
# 1. Requests库概述
## 1.1 Requests库简介
Requests库是一个简单易用的HTTP库,专为Python语言设计,简化了HTTP请求的发送以及响应处理的复杂性。它被广泛应用于Web开发、自动化脚本编写及网络数据抓取等场景。其优雅的API设计使得开发者能用更少的代码实现复杂的网络交互。
## 1.2 Requests库的优势
Requests库在易用性和功能强大之间取得了良好的平衡。相较于Python内置的urllib库,Requests对异常处理、会话维持、认证授权等方面做了很好的封装,极大提高了开发效率。此外,Requests库还支持各种数据格式的自动转换,如JSON,使得数据处理更加直观便捷。
## 1.3 Requests库安装与导入
### 1.3.1 安装Requests库
在Python环境中安装Requests库非常简单,只需一行命令:
```bash
pip install requests
```
安装完成后,即可导入到项目中使用:
```python
import requests
```
通过这一简单的步骤,开发者就能开始享受Requests库带来的便捷。接下来的章节中,我们将详细探讨如何使用Requests库来执行各种HTTP请求,并处理响应数据。
# 2. ```
# 第二章:Requests库基础使用
## 2.1 安装与导入
### 2.1.1 安装Requests库
Requests库是Python中最流行的HTTP库之一,可以轻松地发送HTTP/1.1请求。在安装前,请确保您的Python环境已经安装了pip。可以通过在命令行中运行以下命令来安装Requests库:
```bash
pip install requests
```
安装完成后,我们可以在Python脚本中导入它:
```python
import requests
```
### 2.1.2 导入和简单使用
一旦安装完成,导入并开始使用Requests库非常直接。最基本的用法包括发送一个GET请求并获取响应内容。下面是一个简单的例子:
```python
response = requests.get('https://api.github.com')
print(response.status_code)
```
在上述代码中,我们导入了Requests库,然后使用`requests.get`方法发送了一个GET请求到GitHub的API接口,并将响应对象存储在变量`response`中。通过访问`response.status_code`属性,我们可以获得HTTP响应状态码。
## 2.2 发送请求
### 2.2.1 GET请求的发送
GET请求是最常见的HTTP请求之一,通常用于请求数据。在Requests库中发送GET请求非常简单。下面的代码展示了如何发起一个GET请求,并处理返回的JSON响应数据:
```python
url = 'https://api.github.com/users/github'
response = requests.get(url)
data = response.json()
print(data['name']) # 输出用户名称
```
在上述代码中,我们向指定的URL发送了GET请求,并通过调用`json()`方法将响应内容解析成Python字典。然后,我们通过键名访问字典中的数据。
### 2.2.2 POST请求的发送
与GET请求不同的是,POST请求通常用于向服务器提交数据。下面的代码演示了如何使用Requests库发送一个POST请求:
```python
url = 'https://httpbin.org/post'
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=payload)
print(response.text) # 打印响应文本
```
在这个例子中,我们定义了一个包含数据的字典`payload`,并将其作为参数传递给`requests.post`方法。服务器端接收到请求后,会解析这些数据并返回相应的响应。
### 2.2.3 其他常见请求类型
除了GET和POST,Requests库也支持其他常见的HTTP请求方法,如PUT、DELETE、HEAD和OPTIONS。这些方法在API开发中非常有用。例如,使用PUT方法更新资源,使用DELETE方法删除资源。每个方法的基本使用方式都类似于GET和POST,只是方法类型不同。
## 2.3 响应内容处理
### 2.3.1 响应内容的获取
获取HTTP响应内容是使用Requests库的基本功能。我们通常关注于响应的内容,比如返回的HTML页面、JSON数据等。下面是一个获取并打印响应内容的例子:
```python
response = requests.get('https://httpbin.org/html')
print(response.text)
```
在这个例子中,`response.text`包含了服务器返回的HTML内容,可以直接打印出来。
### 2.3.2 响应内容的编码处理
有时候,服务器返回的内容可能包含特殊字符,这时候就需要正确处理编码。Requests库会自动解码来自服务器的内容。例如:
```python
response = requests.get('https://httpbin.org/html')
print(response.encoding) # 输出响应内容的编码
```
在这个例子中,`response.encoding`会提供响应内容的编码方式,帮助开发者正确解析文本。
### 2.3.3 错误和异常处理
在网络请求中,错误处理是必不可少的。Requests库中处理网络请求错误的方式是通过引发异常。常见的异常包括`requests.exceptions.ConnectionError`、`requests.exceptions.Timeout`和`requests.exceptions.HTTPError`等。
```python
try:
response = requests.get('https://httpbin.org/404')
except requests.exceptions.HTTPError as errh:
print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
print ("Timeout Error:",errt)
except requests.exceptions.RequestException as err:
print ("Oops: Something Else",err)
```
在这个例子中,我们尝试获取一个不存在的页面,因此预期会发生`HTTPError`错误,从而触发异常处理代码块。
```
# 3. Requests库高级特性
## 3.1 会话保持与Cookie管理
### 3.1.1 会话保持的实现
在Web应用中,用户的很多操作需要保持状态,例如登录后进行的后续操作。在使用Requests库进行HTTP请求时,保持会话状态是一个常见需求。Requests通过会话对象(`Session`)来保存跨请求的参数。使用会话对象可以使得在同一个会话中的请求之间保持某些参数,如Cookies。
```python
import requests
# 创建一个Session对象
session = requests.Session()
# 使用同一个会话发送请求
session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
response = session.get('https://httpbin.org/cookies')
# 打印响应内容
print(response.text)
```
以上代码创建了一个会话对象,并通过这个会话对象发送了两个GET请求。第一个请求设置了`sessioncookie`,第二个请求返回了第一个请求设置的Cookies。Cookies将在两个请求之间保持状态。
### 3.1.2 Cookie的处理方式
Requests库提供了简单而强大的Cookie处理机制。它允许你发送你的Cookie到服务器,就像一个标准的用户代理(User-Agent)一样,并能够处理服务器返回的Cookies。
```python
# 发送带有Cookies的请求
response = session.get('https://httpbin.org/cookies', cookies={'from_user_agent': 'Requests User Agent'})
# 打印响应内容
print(response.text)
```
在这个例子中,我们通过`cookies`参数向服务器发送了一个Cookie。它会作为一个字典传递给请求,同时服务器返回的Cookies也会被存储在会话中。
## 3.2 超时与重试机制
### 3.2.1 设置请求超时
在使用Requests库时,有时会遇到网络延迟或者服务器无响应的情况。为了避免程序无限期地等待响应,可以设置请求超时(timeout)。
```python
# 设置请求超时时间
response = session.get('https://httpbin.org/delay/5', timeout=3)
# 打印响应内容
print(response.text)
```
在上面的代码中,我们通过`timeout`参数设置了请求超时时间为3秒。如果在3秒内服务器没有响应,将会抛出一个`requests.exceptions.Timeout`异常。
### 3.2.2 自动重试机制
有时候,网络问题或服务器问题会导致请求暂时性失败。自动重试机制可以让请求在遇到这类问题时自动尝试重新发送。
```python
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
# 创建一个会话对象
session = requests.Session()
# 设置自动重试策略
retry_strategy = Retry(
total=3, # 总共重试次数
status_forcelist=[429, 500, 502, 503, 504], # 需要重试的状态码
method_whitelist=["HEAD", "GET", "OPTIONS"], # 只在HEAD, GET, OPTIONS方法中重试
backoff_factor=1 # 退避因子
)
adapter = HTTPAdapter(max_retries=retry_strategy)
# 将重试策略添加到会话中
session.mount('http://', adapter)
session.mount('https://', adapter)
# 发送带有自动重试机制的请求
response = session.get('https://httpbin.org/status/500')
# 打印响应内容
print(response.text)
```
在这个例子中,我们使用了`urllib3`库中的`Retry`策略来实现自动重试。首先定义了重试策略,包括重试的总次数、哪些HTTP状态码需要重试,以及退避因子。然后,创建了一个HTTP适配器`HTTPAdapter`并将其与重试策略关联起来。通过`session.mount`方法将适配器挂载到会话上,从而使得所有的HTTP请求都会遵守这个重试策略。
## 3.3 认证与授权
### 3.3.1 基本认证的实现
基本认证是HTTP协议中最常见的一种认证方式。在使用Requests库进行基本认证时,需要提供用户名和密码。Requests库允许我们以一种非常直观的方式来实现基本认证。
```python
from requests.auth import HTTPBasicAuth
# 使用基本认证发送请求
response = session.get('https://httpbin.org/basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd'))
# 打印响应内容
print(response.text)
```
在上面的代码中,我们使用`HTTPBasicAuth`对象并将其作为`auth`参数传递给`get`方法来实现基本认证。这个对象会自动处理HTTP请求中的认证过程。
### 3.3.2 OAuth认证支持
OAuth认证广泛应用于Web应用授权,提供了一种安全、简单的方式来授权第三方应用访问Web服务。Requests库提供了OAuth1和OAuth2的实现,允许开发者方便地使用这两种认证方式。
```python
from requests_oauthlib import OAuth2Session
# 创建一个OAuth2Session对象
oauth = OAuth2Session(client_id='your_client_id', scope=['read', 'write'])
# 进行认证授权流程
authorization_url, state = oauth.authorization_url('https://example.com/oauth/authorize')
print('Please go here and authorize me:', authorization_url)
# 用户授权后,服务器会重定向回指定的回调地址,带上一个临时的授权码(authorization code)
# 这里用一个临时的授权码作为例子
authorization_response = 'https://example.com/oauth/authorize?code=Authorization_CODE'
# 通过授权码获取访问令牌
token = oauth.fetch_token('https://example.com/oauth/token', authorization_response=authorization_response, client_secret='your_secret')
# 使用令牌发送请求
response = oauth.get('https://api.example.com/resource', token=token)
# 打印响应内容
print(response.text)
```
在这个例子中,我们使用了`requests_oauthlib`库中的`OAuth2Session`对象来实现OAuth2认证。首先创建了一个`OAuth2Session`对象,并指定了客户端ID和权限范围。然后通过`authorization_url`方法获取了授权URL,并在用户授权后通过`fetch_token`方法获取了访问令牌。最后,使用获取的令牌通过`get`方法发送了受保护的请求。
以上内容是对Requests库高级特性的介绍,包括会话保持、Cookie管理、超时设置、重试机制、基本认证和OAuth认证。通过这些高级特性,开发者可以更加灵活和安全地使用Requests库进行网络请求的处理。
# 4. Requests库在实际应用中的实践
## 4.1 网络爬虫开发
### 4.1.1 爬取网页的基本流程
开发网络爬虫时,我们通常遵循以下几个基本步骤:确定目标网站、分析网站结构、编写爬取脚本、保存和处理数据。使用Requests库进行网页爬取,第一步是要使用GET请求来获取目标网页的响应。
```python
import requests
from bs4 import BeautifulSoup
# 目标网页URL
url = 'https://www.example.com'
# 发送GET请求
response = requests.get(url)
# 检查请求是否成功
if response.status_code == 200:
# 使用BeautifulSoup解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
# 提取网页中的信息
# 例如提取所有的标题
titles = soup.find_all('h1')
for title in titles:
print(title.get_text())
else:
print(f"请求失败,状态码:{response.status_code}")
```
在上面的代码中,我们首先导入了`requests`和`BeautifulSoup`库。然后发送一个GET请求到目标网站,检查响应状态码确认请求成功。接着,使用`BeautifulSoup`解析了网页的HTML内容,并提取所有的`h1`标签作为示例。这是一个非常基础的爬虫实现。
### 4.1.2 处理JavaScript动态加载的内容
很多现代网站使用JavaScript动态加载内容,直接爬取这些网站的静态HTML并不能获取到所有想要的数据。此时,我们可以使用`requests-html`库来处理动态内容。
```python
from requests_html import HTMLSession
session = HTMLSession()
# 目标网页URL
url = 'https://www.example.com'
# 发送请求并获取响应
response = session.get(url)
# 使用session的render方法来渲染JavaScript
response.html.render()
# 现在response.html包含了渲染后的网页内容
# 提取动态加载的数据
scripts = response.html.find('script')
for script in scripts:
print(script.text)
```
通过上述代码,我们首先创建了一个`HTMLSession`对象,它能够处理JavaScript渲染的页面。`get`方法用于获取初始页面,`render`方法则是用来执行JavaScript并将页面渲染完成后的HTML加载到`response.html`中。之后,我们就可以像处理静态页面一样提取动态内容了。
处理JavaScript动态加载的内容可能需要额外的步骤,如等待元素加载完成、处理Ajax调用等。这通常需要根据目标网站的具体实现进行特定的调整。
## 4.2 Web API的调用
### 4.2.1 与RESTful API交互
RESTful API是一种非常流行的服务端应用程序接口设计方式,它使用HTTP协议的各种方法来进行接口设计。使用Requests库与RESTful API进行交互是非常直接的。
```python
# 假设我们要调用一个RESTful API来获取用户信息
url = 'https://api.example.com/users/1'
response = requests.get(url)
if response.status_code == 200:
user_data = response.json() # 解析JSON数据
print(f"用户信息: {user_data}")
else:
print(f"请求失败,状态码:{response.status_code}")
```
在上述代码中,我们通过GET请求获取了用户信息,并将返回的JSON格式数据解析成了Python字典。处理JSON数据时,我们通常会用`response.json()`方法,它能够自动解析JSON格式的响应体。
### 4.2.2 处理API响应数据
在与RESTful API交互时,我们需要正确处理响应数据。这包括检查响应的状态码,解析JSON数据,以及处理可能的异常情况。
```python
# 假设我们遇到了一个需要登录的API
api_url = 'https://api.example.com/protected/data'
login_url = 'https://api.example.com/login'
# 登录并获取token
login_response = requests.post(login_url, data={'username': 'user', 'password': 'pass'})
token = login_response.json().get('token')
# 使用token访问受保护的数据
headers = {'Authorization': f'Bearer {token}'}
protected_response = requests.get(api_url, headers=headers)
if protected_response.status_code == 200:
protected_data = protected_response.json()
print(f"受保护的数据: {protected_data}")
else:
print(f"访问受保护资源失败,状态码:{protected_response.status_code}")
```
在该示例中,我们首先发送POST请求到登录API,并获取一个token。随后,我们使用这个token作为认证信息,通过HTTP头部`Authorization`发送请求到受保护的API资源。代码中也包含了对响应状态码的检查,确保请求成功。
## 4.3 第三方服务集成
### 4.3.1 使用第三方API服务
集成第三方API服务,通常需要遵循API提供者的文档进行操作,包括注册应用、获取API密钥、了解API端点、请求方法、参数和返回格式。
```python
# 假设我们使用一个天气API服务
api_key = 'YOUR_API_KEY'
api_endpoint = 'http://api.weatherapi.com/v1/current.json'
location = 'London'
# 完整的请求URL
url = f"{api_endpoint}?key={api_key}&q={location}"
response = requests.get(url)
if response.status_code == 200:
weather_data = response.json()
print(f"当前位置的天气: {weather_data}")
else:
print(f"请求天气数据失败,状态码:{response.status_code}")
```
在上述示例中,我们构造了一个API请求URL,包括API密钥和需要查询的地点。然后发送请求并打印天气信息。集成第三方API时,需要严格遵循API文档的要求来构造请求,包括查询参数和请求头。
### 4.3.2 与第三方支付接口的交互
与支付接口交互可能涉及到敏感的支付信息,因此需要格外小心,确保遵守所有安全规范。
```python
# 假设我们使用一个支付API进行支付请求
payment_api_url = 'https://api.paymentprovider.com/charge'
api_key = 'YOUR_API_KEY'
customer_id = '12345'
amount = '10.00'
currency = 'USD'
# 构造支付请求的数据
payment_data = {
'api_key': api_key,
'customer_id': customer_id,
'amount': amount,
'currency': currency,
}
# 发送支付请求
response = requests.post(payment_api_url, json=payment_data)
if response.status_code == 200:
payment_confirmation = response.json()
print(f"支付确认: {payment_confirmation}")
else:
print(f"支付请求失败,状态码:{response.status_code}")
```
在上述代码中,我们通过发送POST请求到支付API,并传递必要的支付数据来发起支付。支付API通常会返回一个支付确认响应,包含交易状态和相关的支付信息。处理支付请求时,必须确保数据传输的安全性,防止信息泄露。
请注意,在实际应用中,集成第三方支付接口需要采用加密通信和严格的安全措施,如使用HTTPS协议,隐藏敏感信息,遵循PCI DSS标准等,这里仅为示例说明。
# 5. 性能优化与安全性提升
性能优化和安全性是软件开发中不可或缺的两个方面。在使用Requests库进行网络请求时,合理的性能优化可以减少服务器负载,提高程序运行效率;而安全性措施则可以保护用户数据,防止潜在的网络攻击。本章将深入探讨在使用Requests库时,如何通过特定的策略和技术来提升性能和安全性。
## 5.1 性能优化策略
在使用Requests库时,我们可能会遇到需要大量发送请求的场景,比如进行大规模的数据采集或者实现高并发的后台服务。在这种情况下,性能优化显得尤为重要。性能优化策略主要包括并发请求的处理和连接池的使用。
### 5.1.1 并发请求的处理
并发请求指的是同时或在很短时间内连续发送多个请求,这比串行请求(一个接一个地发送请求)要高效得多。在Python中,可以使用`concurrent.futures`模块来实现并发请求。
```python
import requests
from concurrent.futures import ThreadPoolExecutor
def fetch_url(url):
try:
response = requests.get(url)
return response.text
except requests.exceptions.RequestException as e:
print(e)
return None
urls = ['http://example.com'] * 100 # 一个URL列表示例
with ThreadPoolExecutor(max_workers=10) as executor:
future_to_url = {executor.submit(fetch_url, url): url for url in urls}
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
data = future.result()
print(f"Contents of {url} retrieved: {len(data)} characters")
except Exception as exc:
print(f"URL {url} generated an exception: {exc}")
```
在上述代码中,我们创建了一个线程池,并提交了多个请求任务。`ThreadPoolExecutor`会自动分配线程来处理这些任务。需要注意的是,过多的线程可能会导致系统资源的过度消耗,因此`max_workers`参数需要根据实际情况合理设置。
### 5.1.2 连接池的使用
连接池是一种管理网络连接的技术,用于减少建立和关闭连接时的开销。Requests库内部实现了连接池,但可以通过`session`对象来控制。
```python
import requests
session = requests.Session()
for url in urls:
session.get(url) # 通过相同的Session对象发送多个请求,重用TCP连接
# Session对象会保持连接,避免了TCP握手的开销。
```
`Session`对象在底层使用了一个连接池来维护与服务器的连接。同一个`Session`对象发出的请求会尽可能重用TCP连接,从而提高性能。
## 5.2 安全性实践
安全性是网络请求中另一个极其重要的方面。使用HTTPS、处理好身份验证和授权以及采取措施防范常见的网络攻击都是提升安全性的关键步骤。
### 5.2.1 HTTPS的使用
HTTPS(HyperText Transfer Protocol Secure)是HTTP的安全版,它通过SSL/TLS提供加密通信和身份验证功能。在使用Requests库时,默认情况下所有的请求都是通过HTTPS发送的,除非指定了其他协议。
```python
import requests
response = requests.get('https://example.com')
print(response.url) # 应该输出一个https开头的URL
```
即使使用HTTPS,仍需注意证书的有效性,以及是否通过了证书颁发机构(CA)的认证。在开发中,应当编写逻辑来验证SSL证书的有效性。
### 5.2.2 防止常见的网络攻击
网络攻击手段多种多样,其中一些攻击如CSRF(跨站请求伪造)、XSS(跨站脚本攻击)和中间人攻击(MITM)等,即使在使用了HTTPS的情况下也不能完全避免。开发者可以通过以下措施来减少风险:
- 验证用户输入的合法性,避免XSS攻击。
- 使用CSRF Token来验证请求的合法性,防御CSRF攻击。
- 确保HTTPS证书正确无误,避免MITM攻击。
- 定期更新软件库和依赖,以修复已知的安全漏洞。
在Requests库中,可以通过设置超时来减少MITM攻击的风险。
```python
session = requests.Session()
session.mount('https://', requests.adapters.HTTPAdapter(max_retries=3))
response = session.get('https://example.com', timeout=5) # 设置超时时间
```
设置合理的超时可以避免因为连接长期不活动而导致的安全风险。
性能优化和安全性提升是一个持续的过程,需要开发者在实践中不断探索和改进。使用Requests库时,应针对实际应用场景,采取相应的策略,以确保应用的高效和安全运行。在下一章,我们将讨论Requests库的扩展和常见的故障排除方法,帮助开发者进一步提升开发效率和解决潜在的问题。
# 6. 扩展与故障排除
## 6.1 Requests库的扩展
在实际开发中,Requests库已经提供了丰富的功能,但在一些特定情况下,可能还需要进行扩展。这就需要对Requests库本身或者第三方扩展包有所了解。
### 6.1.1 第三方扩展包的介绍
第三方扩展包能够提供额外的功能,比如更复杂的认证机制、代理支持等。一些流行的扩展包有:
- `requests-oauthlib`:提供OAuth 1.0a和OAuth 2.0的实现。
- `requests-toolbelt`:提供了处理多部分编码、HTTP重定向等功能的工具。
- `requests-mock`:用于测试与HTTP请求有关的代码,可以在不进行真实网络调用的情况下模拟请求。
使用这些扩展包,可以帮助我们更容易地实现复杂的网络请求和测试。
### 6.1.2 自定义扩展的编写
在某些情况下,第三方扩展包可能无法满足特定的需求,这时就需要编写自定义的扩展。自定义扩展通常包括两个部分:创建一个新的类,以及为这个类添加自定义的请求方法。
下面是一个简单的示例,自定义一个可以自动重试的请求类:
```python
import requests
from requests.exceptions import RequestException
class RetryRequest:
def __init__(self, max_retries=3):
self.max_retries = max_retries
def request(self, method, url, **kwargs):
retries = 0
while retries < self.max_retries:
try:
response = requests.request(method, url, **kwargs)
response.raise_for_status()
return response
except RequestException as e:
retries += 1
print(f"Retrying... Attempt {retries}/{self.max_retries}")
# 使用自定义扩展
if __name__ == "__main__":
rr = RetryRequest()
response = rr.request("GET", "https://httpbin.org/get")
print(response.text)
```
上述代码创建了一个`RetryRequest`类,它在请求失败时会自动重试,直到达到设定的最大重试次数。
## 6.2 常见问题与解决方法
在使用Requests库进行网络请求时,我们可能会遇到各种问题。下面是一些常见的问题及其解决方法。
### 6.2.1 调试技巧与日志记录
调试网络请求时,确保能够捕获并记录所有请求细节是十分重要的。Requests库提供了一个`hooks`功能,允许我们在请求或响应过程中插入特定的行为。例如:
```python
import requests
def log_response(response, *args, **kwargs):
print("Response received.")
print(f"Status: {response.status_code}")
print(f"Headers: {response.headers}")
print(f"Body: {response.text}")
response = requests.get("https://httpbin.org/get", hooks={'response': log_response})
```
### 6.2.2 解决连接问题和404错误
遇到无法连接的服务器或者404错误时,我们可以采取以下措施:
- 确认URL是否正确。
- 检查网络连接是否正常。
- 确认服务器是否运行正常(可用其他工具如`curl`尝试连接)。
- 使用`verify`参数来控制SSL证书的验证。
- 增加超时时间(`timeout`),避免请求永远等待。
下面是一个处理连接超时的示例:
```python
try:
response = requests.get("https://httpbin.org/get", timeout=5)
except requests.exceptions.Timeout:
print("Request timed out!")
```
在本章中,我们讨论了Requests库的扩展方式和常见问题的处理方法。通过理解和掌握这些技巧,可以帮助我们更好地使用Requests库,提升开发效率和程序的健壮性。
0
0