【Python爬虫】简单而强大的request库

在这里插入图片描述

1、介绍

在现代的Web开发中,与服务器进行HTTP通信是一项重要的任务。Python的Requests库是一个简单而强大的第三方库,它提供了简洁的API,使得发送HTTP请求变得非常容易。本教程将介绍如何使用Python Requests库发送各种类型的HTTP请求,并处理响应。

1.1 HTTP请求和响应

在开始之前,让我们简要了解HTTP请求和响应的基本概念。HTTP是一种用于客户端和服务器之间通信的协议。客户端发送请求给服务器,服务器则返回相应的响应。请求包含方法(GET、POST等)、URL、请求头、请求体等信息,而响应包含状态码、响应头、响应体等信息。

1.2 Python Requests库的作用和优势

Python Requests库是一个流行的第三方库,用于发送HTTP请求和处理响应。它提供了简洁的API,使得发送请求变得非常简单。一些Python内置的HTTP库(如urllib)也能完成类似的任务,但Requests库更易于使用,提供了更多的功能和灵活性。

1.3 安装Requests库

在开始之前,确保已经安装了Python解释器。要安装Requests库,可以使用pip命令执行以下指令:

pip install requests

安装完成后,我们就可以开始使用Requests库发送HTTP请求了。

2、发送GET请求

GET请求用于从服务器获取数据。下面是一些常见的GET请求的示例。

2.1 发送基本的GET请求

使用Requests库发送一个简单的GET请求非常简单。只需提供目标URL即可。

import requests

response = requests.get('https://api.example.com/data')
print(response.text)

上述代码会向https://api.example.com/data发送一个GET请求,并打印出响应的内容。

2.2 添加查询参数

有时,我们需要在URL中添加查询参数,以获取特定的数据。可以使用params参数来指定查询参数。

import requests

payload = {
    
    'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://api.example.com/data', params=payload)
print(response.text)

上述代码会将查询参数key1=value1key2=value2添加到URL中。

2.3 设置请求头

请求头包含了关于请求的附加信息,如User-Agent、Accept等。可以使用headers参数来设置请求头。

import requests

headers = {
    
    'User-Agent': 'Mozilla/5.0'}
response = requests.get('https://api.example.com/data', headers=headers)
print(response.text)

上述代码设置了User-Agent请求头,以模拟浏览器发送请求。

2.4 处理响应

得到响应后,我们可以对其进行各种操作。例如,可以获取响应的状态码、头部信息和内容。

import requests

response

 = requests.get('https://api.example.com/data')
print(response.status_code)  # 打印状态码
print(response.headers)      # 打印响应头
print(response.text)         # 打印响应内容

上述代码展示了如何获取状态码、响应头和响应内容。

3、发送POST请求

POST请求用于向服务器提交数据。下面是一些常见的POST请求的示例。

3.1 发送基本的POST请求

使用Requests库发送一个简单的POST请求也很简单。只需提供目标URL和要发送的数据即可。

import requests

payload = {
    
    'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://api.example.com/submit', data=payload)
print(response.text)

上述代码会向https://api.example.com/submit发送一个POST请求,并打印出响应的内容。

3.2 发送表单数据

在Web开发中,通常会使用表单来收集用户的输入数据。可以使用data参数来发送表单数据。

import requests

data = {
    
    'username': 'john', 'password': 'secret'}
response = requests.post('https://api.example.com/login', data=data)
print(response.text)

上述代码将用户名和密码作为表单数据发送到https://api.example.com/login。

3.3 发送JSON数据

除了发送表单数据外,还可以发送JSON格式的数据。可以使用json参数来发送JSON数据。

import requests

data = {
    
    'name': 'John Doe', 'age': 30}
response = requests.post('https://api.example.com/user', json=data)
print(response.text)

上述代码会将字典data转换为JSON格式,并发送到https://api.example.com/user。

3.4 处理响应

与GET请求类似,我们也可以对POST请求的响应进行各种操作。例如,获取状态码、头部信息和内容。

import requests

response = requests.post('https://api.example.com/submit', data={
    
    'key': 'value'})
print(response.status_code)  # 打印状态码
print(response.headers)      # 打印响应头
print(response.text)         # 打印响应内容

上述代码展示了如何获取POST请求的响应信息。

4、 请求会话管理

在某些情况下,我们可能需要保持会话状态或处理Cookie。Requests库提供了会话对象来处理这些情况。

4.1 使用会话对象

使用会话对象可以在多个请求之间共享状态。会话对象可以保持Cookie、设置请求头等。

import requests

session = requests.Session()
session.get('https://api.example.com/login')
response = session.get('https://api.example.com/dashboard')
print(response.text)

上述代码创建了一个会话对象,并在登录后保持会话状态,然后发送另一个请求到仪表盘页面。

4.2 保持会话状态

会话对象会自动保持Cookie,并在后续请求中自动发送。这对于模拟用户登录和进行连续的请求非常有用。

import requests

session = requests.Session()
login_data =

 {
    
    'username': 'john', 'password': 'secret'}
session.post('https://api.example.com/login', data=login_data)
response = session.get('https://api.example.com/dashboard')
print(response.text)

上述代码在登录后保持会话状态,并使用同一会话对象发送后续请求。

4.3 处理Cookie

会话对象还可以方便地处理Cookie。可以使用cookies属性获取当前会话的Cookie,或者使用cookies参数发送自定义Cookie。

import requests

session = requests.Session()
session.get('https://api.example.com/login')
cookies = session.cookies.get_dict()  # 获取当前会话的Cookie
response = session.get('https://api.example.com/dashboard', cookies=cookies)
print(response.text)

上述代码获取当前会话的Cookie,并将其发送到仪表盘页面。

5、处理异常和错误

在HTTP请求中,可能会出现各种异常和错误。Requests库提供了一些机制来处理这些异常和错误。

5.1 处理请求超时

如果请求超时,可以设置timeout参数来限制请求的等待时间。

import requests

try:
    response = requests.get('https://api.example.com/data', timeout=5)
    print(response.text)
except requests.Timeout:
    print('请求超时')

上述代码将请求超时时间设置为5秒,并捕获Timeout异常。

5.2 处理连接错误

如果连接服务器时出现错误,可以捕获requests.ConnectionError异常。

import requests

try:
    response = requests.get('https://api.example.com/data')
    print(response.text)
except requests.ConnectionError:
    print('连接错误')

上述代码在发生连接错误时捕获异常。

5.3 处理HTTP错误状态码

如果服务器返回了错误的HTTP状态码,可以使用response.raise_for_status()方法抛出异常。

import requests

response = requests.get('https://api.example.com/data')
try:
    response.raise_for_status()
    print(response.text)
except requests.HTTPError:
    print('HTTP错误')

上述代码将检查响应的状态码,并在状态码不为2xx时抛出异常。

6、高级功能和扩展

除了基本的HTTP请求,Requests库还提供了一些高级功能和扩展,以满足更复杂的需求。

6.1 文件上传和下载

使用Requests库可以轻松上传和下载文件。

import requests

# 文件上传
files = {
    
    'file': open('data.txt', 'rb')}
response = requests.post('https://api.example.com/upload', files=files)

# 文件下载
response = requests.get('https://api.example.com/download/data.txt')
with open('data.txt', 'wb') as file:
    file.write(response.content)

上述代码展示了文件上传和下载的示例。

6.2 SSL验证和证书

Requests库支持SSL验证和自定义证书。

import requests

response = requests.get('https://api.example.com', verify=True)  # 开启SSL验证

# 使用自定义证书
response = requests.get('https://api.example.com', cert=('client.crt', 'client.key'))

上述代码展示了如何开启SSL验证以及使用自定义证书。

6.3 代理设置

如果需要通过代理服务器发送请求,可以使用proxies参数设置代理。

import requests

proxies = {
    
    'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}
response = requests.get('https://api.example.com', proxies=proxies)

上述代码将请求通过代理服务器发送。

7、最佳实践

7.1 使用会话对象

在发送多个相关请求时,使用会话对象可以更好地管理会话状态和共享数据。这样可以提高效率并减少不必要的重复操作。尤其是在需要保持登录状态或处理Cookie的情况下,使用会话对象是非常方便的。

import requests

session = requests.Session()
session.get('https://api.example.com/login')
# 发送其他请求...

7.2 处理异常

在发送请求时,不可避免地会遇到一些异常情况,如连接超时、服务器错误等。为了保证程序的健壮性,建议使用异常处理机制来捕获和处理这些异常。

import requests

try:
    response = requests.get('https://api.example.com/data', timeout=5)
    response.raise_for_status()
    # 处理响应...
except requests.exceptions.Timeout:
    print('请求超时')
except requests.exceptions.HTTPError:
    print('HTTP错误')
except requests.exceptions.RequestException as e:
    print('请求异常:', str(e))

7.3 设置超时时间

在发送请求时,设置适当的超时时间是很重要的。如果等待时间过长,可能会影响程序的响应速度。通过设置timeout参数,可以限制请求的等待时间。

import requests

response = requests.get('https://api.example.com/data', timeout=5)

建议根据具体情况设置合适的超时时间,避免请求长时间阻塞。

7.4 检查响应状态码

在处理响应时,经常需要检查响应的状态码。正确的状态码表示请求成功,而错误的状态码可能需要采取相应的处理措施。

import requests

response = requests.get('https://api.example.com/data')
if response.status_code == 200:
    print('请求成功')
else:
    print('请求失败:', response.status_code)

根据不同的状态码,可以采取不同的处理逻辑,例如重试请求、记录日志或抛出异常。

8、常见问题

8.1 证书验证失败

在某些情况下,当请求的URL使用了HTTPS协议且证书验证失败时,Requests库可能会抛出requests.exceptions.SSLError异常。这通常是因为目标网站的证书无效或过期。

为了解决这个问题,可以设置verify参数为False,跳过证书验证。

import requests

response = requests.get('https://api.example.com', verify=False)

请注意,跳过证书验证存在安全风险,建议仅在测试环境下使用。

8.2 重定向问题

默认情况下,Requests库会自动处理重定向。当服务器返回重定向响应时,Requests库会自动跟随重定向,并返回最终的响应结果。

import requests

response = requests.get('https://api.example.com/redirect')
print(response.url)   # 打印最终

重定向后的URL

如果需要禁用重定向,可以设置allow_redirects参数为False

import requests

response = requests.get('https://api.example.com/redirect', allow_redirects=False)
print(response.status_code)   # 打印重定向响应的状态码

8.3 中文编码问题

在处理包含中文字符的请求时,有时会遇到编码问题。为了避免乱码或编码错误,可以使用encodedecode方法来指定字符编码。

import requests

response = requests.get('https://api.example.com/data')
response.encoding = 'utf-8'  # 指定字符编码
content = response.text

根据具体的字符编码,将response.encoding设置为相应的值。

连接池耗尽

当程序频繁发送大量的请求时,可能会导致连接池耗尽的问题。这时,可以通过增加连接池的大小来提高并发性能。

import requests

adapter = requests.adapters.HTTPAdapter(pool_connections=100, pool_maxsize=100)
session = requests.Session()
session.mount('https://', adapter)

通过将pool_connectionspool_maxsize设置为合适的值,可以增加连接池的容量,以满足高并发请求的需求。

9、总结

本教程介绍了Python Requests库的基本用法和高级功能。学习了如何发送GET和POST请求,处理响应,管理会话状态,处理异常和错误,并探讨了一些高级功能。通过掌握Requests库,可以轻松地进行Web开发中的HTTP请求和响应处理。

通过本教程的学习,希望可以对Python Requests库有了更深入的了解,并能够灵活运用它来处理各种HTTP通信需求。

参考链接:

猜你喜欢

转载自blog.csdn.net/mingfeng4923/article/details/131077681