Python HTTP客户端请求
HTTP 客户端请求是网络编程的基础,Python 提供多种方式发送请求。
urllib 基本请求
Python
from urllib.request import urlopen, Request
from urllib.parse import urlencode
# GET 请求
response = urlopen('https://httpbin.org/get')
data = response.read().decode('utf-8')
print(data)
# POST 请求
data = urlencode({'key': 'value'}).encode('utf-8')
response = urlopen('https://httpbin.org/post', data=data)
result = response.read().decode('utf-8')
urllib 自定义请求
Python
from urllib.request import Request, urlopen
# 自定义请求头
req = Request(
'https://httpbin.org/get',
headers={
'User-Agent': 'Python-Client',
'Authorization': 'Bearer token'
}
)
response = urlopen(req)
print(response.read().decode('utf-8'))
# 添加自定义方法
req = Request('https://httpbin.org/delete', method='DELETE')
response = urlopen(req)
requests 基本使用
Python
import requests
# GET 请求
response = requests.get('https://httpbin.org/get')
print(response.json())
# 带参数 GET
response = requests.get(
'https://httpbin.org/get',
params={'key': 'value', 'id': 123}
)
print(response.url) # 显示完整 URL
# POST 请求
response = requests.post(
'https://httpbin.org/post',
data={'username': 'alice', 'password': 'secret'}
)
print(response.json())
requests JSON 处理
Python
import requests
# 发送 JSON 数据
response = requests.post(
'https://httpbin.org/post',
json={'name': 'Alice', 'age': 25}
)
print(response.json())
# 自动解析响应 JSON
response = requests.get('https://httpbin.org/get')
data = response.json() # 自动解析
print(data['args'])
requests 自定义请求头
Python
import requests
headers = {
'User-Agent': 'Python-Client/1.0',
'Authorization': 'Bearer abc123',
'Content-Type': 'application/json'
}
response = requests.get(
'https://httpbin.org/headers',
headers=headers
)
print(response.json())
requests 响应处理
Python
import requests
response = requests.get('https://httpbin.org/get')
# 响应内容
print(response.text) # 文本内容
print(response.content) # 字节内容
print(response.json()) # JSON 解析
# 响应信息
print(response.status_code) # 状态码
print(response.headers) # 响应头
print(response.cookies) # Cookie
# 状态码检查
if response.status_code == 200:
print("请求成功")
elif response.status_code == 404:
print("资源不存在")
requests 会话管理
Python
import requests
# Session 保持连接和 Cookie
session = requests.Session()
session.headers.update({'User-Agent': 'Python-Client'})
# 多次请求共享 Session
response = session.get('https://httpbin.org/cookies/set?name=value')
response = session.get('https://httpbin.org/cookies')
print(response.json()['cookies'])
# 登录后保持会话
session.post('https://example.com/login', data={'user': 'alice'})
response = session.get('https://example.com/profile')
requests 异常处理
Python
import requests
from requests.exceptions import RequestException
try:
response = requests.get(
'https://httpbin.org/delay/5',
timeout=3 # 超时设置
)
except requests.Timeout:
print("请求超时")
except requests.ConnectionError:
print("连接错误")
except requests.HTTPError as e:
print(f"HTTP错误: {e}")
except RequestException as e:
print(f"请求异常: {e}")
# 使用 raise_for_status 检查
response = requests.get('https://httpbin.org/status/404')
try:
response.raise_for_status()
except requests.HTTPError:
print("HTTP状态码错误")
urllib vs requests
| 特性 | urllib | requests |
|---|---|---|
| 简洁性 | 复杂 | 简洁 |
| JSON处理 | 手动解析 | 自动解析 |
| Session | 无 | 支持 |
| 错误处理 | 通用 | 专用异常 |
| 参数编码 | urlencode | params 参数 |
requests 完整示例
Python
import requests
class HttpClient:
def __init__(self, base_url, headers=None):
self.session = requests.Session()
self.base_url = base_url
if headers:
self.session.headers.update(headers)
def get(self, path, params=None, timeout=10):
url = f"{self.base_url}{path}"
response = self.session.get(url, params=params, timeout=timeout)
response.raise_for_status()
return response.json()
def post(self, path, data=None, json=None, timeout=10):
url = f"{self.base_url}{path}"
response = self.session.post(
url, data=data, json=json, timeout=timeout
)
response.raise_for_status()
return response.json()
# 使用
client = HttpClient('https://httpbin.org')
data = client.get('/get', params={'key': 'value'})
print(data)
要点总结
- urllib 是标准库,requests 是第三方库(更推荐)
requests.get()发送 GET 请求requests.post()发送 POST 请求params参数自动编码 URL 参数json参数自动处理 JSON 数据Session保持连接和 Cookietimeout设置请求超时raise_for_status()检查 HTTP 状态码- requests 异常类细化错误类型
📝 发现内容有误?点击此处直接编辑