第106集 requests库基础
学习目标
- 了解requests库的基本概念和特点
- 掌握requests库的安装方法
- 学会发送GET请求并处理响应
- 学会发送POST请求并提交数据
- 掌握请求参数、请求头、Cookie的设置方法
- 学会处理响应内容和状态码
- 了解基本的错误处理方法
一、requests库概述
1. 什么是requests库
requests是Python中用于发送HTTP请求的第三方库,它提供了简洁易用的API,使得发送HTTP请求变得非常方便。requests库是Python开发者最常用的HTTP客户端库之一。
2. requests库的特点
- 简洁易用:提供了直观的API,比Python标准库中的urllib更加方便
- 功能强大:支持各种HTTP方法、请求参数、请求头、Cookie、会话等
- 自动处理编码:自动处理响应内容的编码
- 连接池支持:提高了性能
- SSL验证:支持HTTPS
- 国际化域名和URL:支持国际化的域名和URL
3. 安装requests库
在命令行中使用pip安装requests库:
pip install requests安装完成后,可以在Python中导入requests库:
import requests二、发送GET请求
GET请求是最常用的HTTP请求方法,用于从服务器获取资源。
1. 基本的GET请求
import requests
# 发送GET请求
response = requests.get('https://www.example.com')
# 打印响应内容
print(response.text)2. 带参数的GET请求
可以通过params参数传递查询参数:
import requests
# 定义查询参数
data = {
'name': '张三',
'age': 25
}
# 发送带参数的GET请求
response = requests.get('https://www.example.com/api/users', params=data)
# 打印请求URL
print(response.url) # 输出: https://www.example.com/api/users?name=张三&age=25
# 打印响应内容
print(response.text)3. 自定义请求头
可以通过headers参数设置请求头:
import requests
# 定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
# 发送带自定义请求头的GET请求
response = requests.get('https://www.example.com', headers=headers)
# 打印响应内容
print(response.text)三、发送POST请求
POST请求用于向服务器提交数据,例如表单提交、上传文件等。
1. 基本的POST请求
import requests
# 定义要提交的数据
data = {
'username': 'admin',
'password': '123456'
}
# 发送POST请求
response = requests.post('https://www.example.com/login', data=data)
# 打印响应内容
print(response.text)2. 提交JSON数据
如果需要提交JSON格式的数据,可以使用json参数:
import requests
# 定义要提交的JSON数据
json_data = {
'name': '张三',
'age': 25,
'email': 'zhangsan@example.com'
}
# 发送POST请求,提交JSON数据
response = requests.post('https://www.example.com/api/users', json=json_data)
# 打印响应内容
print(response.text)3. 上传文件
可以使用files参数上传文件:
import requests
# 定义要上传的文件
files = {
'file': open('example.txt', 'rb')
}
# 发送POST请求,上传文件
response = requests.post('https://www.example.com/upload', files=files)
# 打印响应内容
print(response.text)四、处理响应
requests库的响应对象包含了服务器返回的所有信息。
1. 响应状态码
import requests
response = requests.get('https://www.example.com')
# 获取响应状态码
print(response.status_code) # 输出: 200
# 判断请求是否成功
if response.status_code == 200:
print('请求成功')
else:
print('请求失败')2. 响应头
import requests
response = requests.get('https://www.example.com')
# 获取所有响应头
print(response.headers)
# 获取特定响应头
print(response.headers['Content-Type']) # 输出: text/html; charset=UTF-83. 响应内容
import requests
response = requests.get('https://www.example.com')
# 获取响应内容(字符串)
print(response.text)
# 获取响应内容(字节)
print(response.content)
# 获取响应内容(JSON格式,自动解析)
# 注意:只有响应内容是JSON格式时才能使用
print(response.json())4. Cookie信息
import requests
response = requests.get('https://www.example.com')
# 获取Cookie信息
print(response.cookies)
# 获取特定Cookie值
print(response.cookies.get('session_id'))五、会话管理
会话对象可以在多个请求之间保持某些参数,例如Cookie。
import requests
# 创建会话对象
session = requests.Session()
# 发送第一个请求,登录系统
login_data = {
'username': 'admin',
'password': '123456'
}
session.post('https://www.example.com/login', data=login_data)
# 发送第二个请求,访问需要登录的页面
response = session.get('https://www.example.com/dashboard')
# 打印响应内容
print(response.text)六、超时设置
可以通过timeout参数设置请求的超时时间:
import requests
# 设置超时时间为5秒
try:
response = requests.get('https://www.example.com', timeout=5)
print(response.text)
except requests.exceptions.Timeout:
print('请求超时')
except requests.exceptions.RequestException as e:
print(f'请求发生错误: {e}')七、SSL证书验证
requests库默认会验证HTTPS请求的SSL证书。如果需要忽略证书验证,可以设置verify参数为False:
import requests
# 忽略SSL证书验证
response = requests.get('https://www.example.com', verify=False)
print(response.text)注意:在生产环境中,不建议忽略SSL证书验证,这会带来安全风险。
八、错误处理
requests库提供了多种异常类,可以用于处理不同类型的错误:
import requests
from requests.exceptions import RequestException, HTTPError, ConnectionError, Timeout
try:
response = requests.get('https://www.example.com')
# 检查响应状态码,如果不是200,抛出HTTPError异常
response.raise_for_status()
print(response.text)
except HTTPError as e:
print(f'HTTP错误: {e}')
except ConnectionError as e:
print(f'连接错误: {e}')
except Timeout as e:
print(f'超时错误: {e}')
except RequestException as e:
print(f'请求错误: {e}')九、实际应用示例
1. 获取网页内容
import requests
# 发送GET请求获取网页内容
response = requests.get('https://www.python.org')
# 打印网页标题
if response.status_code == 200:
# 简单提取标题(实际应用中应使用解析库)
content = response.text
start = content.find('<title>') + 7
end = content.find('</title>')
title = content[start:end]
print(f'网页标题: {title}')
else:
print(f'请求失败,状态码: {response.status_code}')2. 调用API接口
import requests
# 调用JSONPlaceholder API
authors = {
'name': 'John Doe',
'email': 'john@example.com',
'password': 'secret123'
}
# 注册用户
response = requests.post('https://jsonplaceholder.typicode.com/users', json=authors)
if response.status_code == 201:
print('注册成功')
user_data = response.json()
print(f'用户ID: {user_data["id