requests是一个简单易用的HTTP库,用于发送各种HTTP请求。下面我将详细介绍如何使用它。
安装requests
基本用法
1. 发送GET请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| import requests
# 基本GET请求
response = requests.get('https://api.github.com')
print(f"状态码: {response.status_code}")
print(f"响应内容: {response.text[:100]}") # 前100个字符
# 带参数的GET请求
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(f"请求URL: {response.url}")
print(f"响应JSON: {response.json()}")
# 设置请求头
headers = {'User-Agent': 'my-app/1.0.0'}
response = requests.get('https://api.github.com', headers=headers)
|
2. 发送POST请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| import requests
# 发送表单数据
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://httpbin.org/post', data=data)
print(f"状态码: {response.status_code}")
print(f"响应: {response.json()}")
# 发送JSON数据
json_data = {'name': 'John', 'age': 30}
response = requests.post('https://httpbin.org/post', json=json_data)
print(f"JSON响应: {response.json()}")
# 发送文件
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
|
3. 其他HTTP方法
1
2
3
4
5
6
7
8
9
10
11
12
13
| import requests
# PUT请求
response = requests.put('https://httpbin.org/put', data={'key': 'value'})
# DELETE请求
response = requests.delete('https://httpbin.org/delete')
# HEAD请求
response = requests.head('https://httpbin.org/get')
# OPTIONS请求
response = requests.options('https://httpbin.org/get')
|
处理响应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| import requests
response = requests.get('https://api.github.com')
# 响应状态码
print(f"状态码: {response.status_code}")
# 响应头
print(f"响应头: {response.headers}")
print(f"Content-Type: {response.headers['Content-Type']}")
# 响应内容
print(f"文本内容: {response.text}") # 字符串形式
print(f"二进制内容: {response.content}") # 字节形式
print(f"JSON内容: {response.json()}") # JSON解析为字典
# 响应编码
print(f"编码: {response.encoding}")
response.encoding = 'utf-8' # 可以手动设置编码
# 响应时间
print(f"响应时间: {response.elapsed}")
|
高级功能
1. 会话保持
1
2
3
4
5
6
7
8
9
10
11
12
| import requests
# 使用Session对象可以保持会话(如cookies)
session = requests.Session()
# 登录
login_data = {'username': 'user', 'password': 'pass'}
session.post('https://example.com/login', data=login_data)
# 保持登录状态访问其他页面
response = session.get('https://example.com/dashboard')
print(response.text)
|
2. 设置超时
1
2
3
4
5
6
7
8
9
| import requests
try:
# 设置连接和读取超时(秒)
response = requests.get('https://api.github.com', timeout=(3.05, 27))
except requests.exceptions.Timeout:
print("请求超时")
except requests.exceptions.RequestException as e:
print(f"请求错误: {e}")
|
3. 代理设置
1
2
3
4
5
6
7
8
| import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
response = requests.get('https://api.github.com', proxies=proxies)
|
4. SSL证书验证
1
2
3
4
5
6
7
| import requests
# 禁用SSL验证(不推荐用于生产环境)
response = requests.get('https://example.com', verify=False)
# 使用自定义CA证书
response = requests.get('https://example.com', verify='/path/to/cert.pem')
|
5. 认证
1
2
3
4
5
6
7
8
9
10
| import requests
from requests.auth import HTTPBasicAuth
# 基本认证
response = requests.get('https://api.github.com/user',
auth=HTTPBasicAuth('username', 'password'))
# 简化写法
response = requests.get('https://api.github.com/user',
auth=('username', 'password'))
|
错误处理
1
2
3
4
5
6
7
8
9
10
11
12
13
| import requests
try:
response = requests.get('https://api.github.com')
response.raise_for_status() # 如果状态码不是200,抛出HTTPError异常
except requests.exceptions.HTTPError as err:
print(f"HTTP错误: {err}")
except requests.exceptions.ConnectionError as err:
print(f"连接错误: {err}")
except requests.exceptions.Timeout as err:
print(f"超时错误: {err}")
except requests.exceptions.RequestException as err:
print(f"请求异常: {err}")
|
实际示例
示例1:获取网页内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| import requests
def get_webpage(url):
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
return response.text
except requests.exceptions.RequestException as e:
print(f"获取网页失败: {e}")
return None
content = get_webpage('https://www.example.com')
if content:
print(f"网页内容长度: {len(content)}")
|
示例2:API调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| import requests
def get_github_user_info(username):
url = f'https://api.github.com/users/{username}'
response = requests.get(url)
if response.status_code == 200:
user_data = response.json()
return {
'name': user_data.get('name'),
'company': user_data.get('company'),
'public_repos': user_data.get('public_repos'),
'followers': user_data.get('followers')
}
else:
print(f"请求失败: {response.status_code}")
return None
user_info = get_github_user_info('octocat')
print(user_info)
|
示例3:下载文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| import requests
def download_file(url, filename):
try:
response = requests.get(url, stream=True)
response.raise_for_status()
with open(filename, 'wb') as file:
for chunk in response.iter_content(chunk_size=8192):
file.write(chunk)
print(f"文件下载成功: {filename}")
return True
except Exception as e:
print(f"下载失败: {e}")
return False
# 下载图片示例
download_file('https://www.example.com/image.jpg', 'image.jpg')
|
常用响应方法总结
| 方法/属性 |
说明 |
response.status_code |
HTTP状态码 |
response.text |
响应内容(字符串) |
response.content |
响应内容(字节) |
response.json() |
响应内容(JSON解析为字典) |
response.headers |
响应头(字典) |
response.cookies |
Cookies |
response.url |
最终请求URL |
response.history |
重定向历史 |
response.elapsed |
请求耗时 |
response.raise_for_status() |
检查状态码,失败则抛出异常 |
requests库功能强大但简单易用,是Python中最常用的HTTP客户端库之一。根据你的具体需求选择合适的方法即可。