Python requests库核心用法指南
概述
本文基于requests官方文档的快速入门部分进行整理,requests版本为2.31.0。requests是Python中常用的HTTP客户端库,用于发送各类HTTP请求并处理响应数据。
Response对象解析
当执行HTTP请求(如GET、POST等)成功后,返回的对象是一个Response实例,其类型为requests.Response。该对象包含了服务器返回的各种信息,我们可以通过其属性和方法进行解析。
获取请求的实际URL
import requests
response = requests.get('https://www.google.com')
print(response.url) # 输出最终解析后的URL地址
检查响应状态码
response = requests.get('https://www.google.com')
print(response.status_code) # 输出HTTP状态码,如200、404等
处理文本响应内容
当服务器返回文本格式的数据时,可以使用text属性进行解析。requests会自动根据HTTP响应头中的信息推测合适的编码方式。
response = requests.get('https://www.example.com')
print(response.encoding) # 查看当前使用的编码方式
response.encoding = 'utf-8' # 手动设置编码
print(response.text) # 获取解码后的文本内容
注意:修改encoding属性后,后续访问text属性将使用新的编码值。
处理二进制响应内容
response = requests.get('https://www.example.com/image.png')
print(type(response.content)) # 输出: <class 'bytes'>
print(len(response.content)) # 获取字节长度
解析JSON格式响应
response = requests.get('https://api.github.com/users/octocat')
data = response.json() # 返回Python字典对象
print(data['login']) # 访问JSON中的特定字段
注意:json()方法返回的是Python对象,若需要转换为JSON字符串,需使用json.dumps()。
获取原始套接字响应
在极少数场景下,如果需要直接获取服务器返回的原始字节流,可以访问raw属性,但需要设置stream=True参数。
response = requests.get('https://www.example.com', stream=True)
print(response.raw.read(10)) # 读取前10个字节
响应头处理
获取服务器返回的响应头
response = requests.post('https://httpbin.org/post')
print(response.headers) # 输出所有响应头信息
print(response.headers.get('Content-Type')) # 获取特定响应头
获取请求时发送的Headers
response = requests.get('https://httpbin.org/get')
print(response.request.headers) # 查看发送请求时的headers
获取请求的详细信息
response = requests.get('https://httpbin.org/get')
print(response.request.method) # 请求方法:GET、POST等
print(response.request.url) # 请求URL
print(response.request.body) # 请求体内容
请求头设置
可以为HTTP请求添加自定义的请求头,只需传递一个字典给headers参数即可。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
response = requests.get('https://www.example.com', headers=headers)
请求参数设置
URL查询参数(GET请求)
对于GET请求,参数通常附加在URL的问号后面。requests提供了便捷的params参数来处理参数编码。
params = {
'keyword': 'python',
'page': 1,
'size': 20
}
response = requests.get('https://www.example.com/search', params=params)
print(response.url) # https://www.example.com/search?keyword=python&page=1&size=20
表单数据(POST请求)
提交表单数据时,将参数字典传递给data参数,数据会被编码为form-data格式。
data = {
'username': 'testuser',
'password': '123456'
}
response = requests.post('https://httpbin.org/post', data=data)
当某个键对应多个值时,可以采用以下方式:
data = [
('key', 'value1'),
('key', 'value2'),
]
response = requests.post('https://httpbin.org/post', data=data)
JSON格式数据(POST请求)
发送JSON格式的数据有两种方式:
方式一:手动转换为JSON字符串
import json
payload = {'name': 'Alice', 'age': 25}
response = requests.post(
'https://httpbin.org/post',
data=json.dumps(payload),
headers={'Content-Type': 'application/json'}
)
方式二:使用json参数(推荐,requests 2.4.2+)
payload = {'name': 'Alice', 'age': 25}
response = requests.post('https://httpbin.org/post', json=payload)
requests会自动将payload序列化为JSON,并设置正确的Content-Type头。
注意:如果同时传递了data或files参数,json参数将被忽略。
Cookie处理
发送Cookie
方式一:使用字典传递Cookie
cookies = {
'session_id': 'abc123',
'user_preference': 'dark_mode'
}
response = requests.get('https://www.example.com', cookies=cookies)
方式二:使用RequestsCookieJar(适用于跨域名场景)
import requests.cookies
jar = requests.cookies.RequestsCookieJar()
jar.set('site_cookie', 'value1', domain='example.com', path='/')
jar.set('another_cookie', 'value2', domain='www.example.com', path='/')
response = requests.get('https://www.example.com', cookies=jar)
读取响应中的Cookie
response = requests.get('https://www.example.com')
print(response.cookies) # 获取所有Cookie(RequestsCookieJar类型)
# 访问特定Cookie
session_cookie = response.cookies.get('session_id')
print(session_cookie)
超时设置
设置超时时间后,如果在指定时间内未收到任何响应数据,requests将抛出异常而不会无限等待。
# 设置5秒超时
response = requests.get('https://www.example.com', timeout=5)
超时参数说明:
- 超时时间与数据传输所需时间无关
- 只要在设定时间内收到了响应(无论数据量大小),就不会触发超时
- 超时是针对服务端响应的首字节到达时间
try:
response = requests.get('https://slow-server.example.com', timeout=3)
except requests.exceptions.ConnectTimeout:
print('连接超时,服务器未在规定时间内响应')
错误与异常处理
requests库中所有异常都继承自requests.exceptions.RequestException。
ConnectionError(连接错误)
网络连接失败、DNS解析失败或服务器无法连接时抛出。
import requests
from requests.exceptions import ConnectionError
try:
response = requests.get('https://this-domain-does-not-exist.xyz')
except ConnectionError as e:
print(f'连接错误: {e}')
HTTPError(HTTP错误)
当响应状态码为4xx(客户端错误)或5xx(服务器错误)时,可以通过raise_for_status()手动触发异常。
response = requests.get('https://httpbin.org/status/404')
if response.status_code >= 400:
try:
response.raise_for_status()
except requests.exceptions.HTTPError as e:
print(f'HTTP错误: {e}')
Timeout(超时错误)
请求超时时会抛出Timeout异常。
import requests
from requests.exceptions import Timeout
try:
response = requests.get('https://slow-server.example.com', timeout=2)
except Timeout:
print('请求超时,服务器响应时间过长')
TooManyRedirects(重定向过多)
当请求超过最大重定向次数时抛出。
import requests
from requests.exceptions import TooManyRedirects
try:
response = requests.get('https://httpbin.org/redirect/10', max_redirects=5)
except TooManyRedirects:
print('重定向次数超过限制')
完整的异常处理示例
import requests
from requests.exceptions import (
RequestException,
ConnectionError,
HTTPError,
Timeout,
TooManyRedirects
)
def safe_request(url, **kwargs):
try:
response = requests.get(url, **kwargs)
response.raise_for_status()
return response
except ConnectionError:
print('网络连接失败')
except HTTPError as e:
print(f'HTTP错误: {e}')
except Timeout:
print('请求超时')
except TooManyRedirects:
print('重定向次数过多')
except RequestException as e:
print(f'请求失败: {e}')
return None