pin_drop当前位置:知识文库 ❯ 图文
Python requests库详解 - HTTP请求实战教程
目录
一、requests 库简介
requests 是 Python 生态中最受欢迎的 HTTP 客户端库。它的口号是"HTTP for Humans",意味着让 HTTP 请求变得简单易用。与 Python 标准库中的 urllib 相比,requests 提供了更加简洁直观的 API,自动处理 URL 编码、Cookie 保持、连接池复用等功能。
在日常开发中,无论是调用第三方 API、爬取网页数据,还是实现微服务之间的通信,requests 都是首选工具。
requests 的核心特性
-
简洁 API:一行代码完成 GET/POST 请求
-
自动编码:自动处理 URL 参数编码和 JSON 序列化
-
Cookie 持久化:跨请求自动保持 Cookie 状态
-
连接池:底层使用 urllib3,自动复用 TCP 连接
-
流式下载:支持大文件流式传输,避免内存溢出
二、安装与环境配置
使用 pip 即可快速安装 requests 库:
代码示例
pip install requests安装完成后,可以通过以下方式验证是否安装成功:
代码示例
import requests
print(requests.__version__)
# 输出类似:2.31.0提示:推荐使用虚拟环境(venv 或 conda)隔离项目依赖,避免版本冲突。
三、GET 请求详解
GET 请求是最常用的 HTTP 方法,用于从服务器获取数据。requests 提供了 requests.get() 方法来发起 GET 请求。
基本 GET 请求
代码示例
import requests
# 发起最简单的 GET 请求
response = requests.get('https://httpbin.org/get')
# 检查响应状态码
print(f'状态码:{response.status_code}')
# 获取响应文本
print(f'响应内容:{response.text}')
# 获取响应头
print(f'响应头:{response.headers}')
带查询参数的 GET 请求
使用 params 参数可以方便地传递 URL 查询参数,requests 会自动进行 URL 编码:
代码示例
import requests
# 定义查询参数
params = {
'q': 'Python教程',
'page': 1,
'sort': 'relevance'
}
# requests 会自动编码为:?q=Python%E6%95%99%E7%A8%8B&page=1&sort=relevance
response = requests.get('https://httpbin.org/get', params=params)
# 查看实际发送的 URL
print(f'实际URL:{response.url}')
# 解析 JSON 响应
data = response.json()
print(f'参数:{data["args"]}')
添加自定义请求头
代码示例
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Accept': 'application/json',
'Authorization': 'Bearer your-token-here'
}
response = requests.get('https://httpbin.org/headers', headers=headers)
print(response.json())
四、POST 请求详解
POST 请求用于向服务器提交数据,常见于表单提交、API 数据创建等场景。
发送 JSON 数据
使用 json 参数,requests 会自动将字典序列化为 JSON 并设置正确的 Content-Type 请求头:
代码示例
import requests
# 要提交的数据
payload = {
'username': 'test_user',
'email': 'test@example.com',
'age': 25
}
# 发送 JSON 格式的 POST 请求
response = requests.post('https://httpbin.org/post', json=payload)
print(f'状态码:{response.status_code}')
print(f'返回数据:{response.json()}')
发送表单数据
使用 data 参数发送 application/x-www-form-urlencoded 格式的表单数据:
代码示例
import requests
form_data = {
'username': 'test_user',
'password': 'secret123'
}
response = requests.post('https://httpbin.org/post', data=form_data)
print(response.json()['form'])
# 输出:{'username': 'test_user', 'password': 'secret123'}
Response 对象常用属性和方法
五、Session 会话保持
当需要保持多个请求之间的状态(如登录态、Cookie)时,使用 requests.Session() 可以自动维护 Cookie 和连接池,大幅提升性能。
代码示例
import requests
# 创建会话对象
session = requests.Session()
# 设置会话级别的请求头
session.headers.update({
'User-Agent': 'MyApp/1.0'
})
# 第一次请求:模拟登录
login_data = {'username': 'admin', 'password': 'secret'}
login_resp = session.post('https://httpbin.org/post', data=login_data)
print(f'登录响应:{login_resp.status_code}')
# 第二次请求:自动携带登录后的 Cookie
profile_resp = session.get('https://httpbin.org/get')
print(f'个人资料响应:{profile_resp.status_code}')
# 查看会话中的 Cookie
print(f'会话Cookie:{session.cookies.get_dict()}')
# 使用完毕后关闭会话
session.close()
性能提示:使用 Session 发起 10 次请求比单独发起 10 次 requests.get() 快约 3-5 倍,因为底层复用了 TCP 连接。
六、文件上传与下载
文件上传
使用 files 参数可以轻松上传文件:
代码示例
import requests
# 方式一:简单上传
with open('test.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json()['files'])
# 方式二:指定文件名和内容类型
with open('test.txt', 'rb') as f:
files = {
'file': ('report.pdf', f, 'application/pdf', {'Expires': '0'})
}
response = requests.post('https://httpbin.org/post', files=files)
大文件流式下载
下载大文件时,使用 stream=True 参数避免将整个文件加载到内存中:
代码示例
import requests
url = 'https://example.com/large-file.zip'
response = requests.get(url, stream=True)
# 检查请求是否成功
response.raise_for_status()
# 分块写入文件,每块 8192 字节
with open('downloaded-file.zip', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk: # 过滤掉 keep-alive 空块
f.write(chunk)
print('下载完成!')
七、超时与异常处理
网络请求永远不应该无限制等待,设置超时是最佳实践。requests 提供了完善的异常体系来处理各种网络错误。
超时设置
代码示例
import requests
# 单一超时值:连接+读取总共等待 5 秒
response = requests.get('https://httpbin.org/delay/3', timeout=5)
# 分别设置连接和读取超时(连接 3 秒,读取 10 秒)
response = requests.get('https://httpbin.org/delay/3', timeout=(3, 10))
完整的异常处理模板
代码示例
import requests
from requests.exceptions import (
Timeout,
ConnectionError,
HTTPError,
TooManyRedirects,
RequestException
)
url = 'https://httpbin.org/status/500'
try:
response = requests.get(url, timeout=5)
# 检查 HTTP 状态码
response.raise_for_status()
# 处理响应数据
data = response.json()
print(f'获取数据成功:{data}')
except Timeout:
print('请求超时,请检查网络连接')
except ConnectionError:
print('连接失败,请确认 URL 是否正确')
except HTTPError as e:
print(f'HTTP错误:{e.response.status_code} - {e.response.reason}')
except TooManyRedirects:
print('重定向次数过多')
except RequestException as e:
print(f'其他请求异常:{e}')
八、请求头与代理设置
代理服务器配置
在某些网络环境下,需要通过代理服务器发送请求:
代码示例
import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
# 带认证的代理
# proxies = {
# 'http': 'http://user:password@10.10.1.10:3128/',
# }
response = requests.get('https://httpbin.org/ip', proxies=proxies)
print(response.json())
SSL 证书验证
代码示例
import requests
# 默认验证 SSL 证书(推荐)
response = requests.get('https://httpbin.org/get', verify=True)
# 跳过证书验证(仅用于测试,不推荐生产环境)
response = requests.get('https://self-signed.badssl.com/', verify=False)
# 使用自定义 CA 证书
response = requests.get('https://httpbin.org/get', verify='/path/to/ca-bundle.crt')
安全警告:
verify=False会禁用 SSL 证书验证,存在中间人攻击风险。生产环境中切勿使用!
九、小结与练习题
核心要点回顾
-
requests.get/post:最常用的 HTTP 请求方法
-
params vs data vs json:分别对应 URL 参数、表单数据和 JSON 数据
-
Session 对象:跨请求保持 Cookie,复用连接提升性能
-
超时设置:始终设置 timeout 参数,防止程序永久阻塞
-
异常处理:使用 try-except 捕获各类网络异常
-
流式下载:大文件使用
stream=True分块读取
练习1
编写程序,使用 requests.get() 获取 https://httpbin.org/get 的响应内容,并打印状态码、响应头和 JSON 数据。要求设置 10 秒超时。
练习2
编写一个函数 download_file(url, save_path),实现流式下载功能。函数需要支持超时设置、进度显示(已下载字节数),并在下载失败时抛出有意义的异常。
常见问题
requests 和 urllib 有什么区别?
urllib 是 Python 标准库,无需额外安装,但 API 较为繁琐。requests 是第三方库,API 更简洁直观,自动处理 Cookie、连接池、编码等问题。对于大多数场景,requests 是更好的选择;如果无法安装第三方库,才考虑使用 urllib。
如何设置全局默认超时时间?
可以通过 requests.adapters.DEFAULT_RETRIES 或者使用 Session 并挂载自定义 HTTPAdapter 来设置全局超时。推荐做法是在项目入口设置:requests.request = lambda *args, timeout=10, **kwargs: requests.request(*args, timeout=timeout, **kwargs)
response.json() 报错怎么办?
当响应体不是有效的 JSON 格式时,response.json() 会抛出 requests.exceptions.JSONDecodeError。建议先检查 response.headers.get('Content-Type') 确认返回类型,或使用 try-except 捕获异常。
Session 和直接调用 requests.get() 有什么不同?
直接调用 requests.get() 每次都会创建新的连接,而 Session 会在底层维护一个连接池,复用 TCP 连接。对于同一主机的多次请求,Session 可以显著提升性能。此外,Session 会自动保存和发送 Cookie,适合需要登录态的场景。
本文涉及AI创作
内容由AI创作,请仔细甄别