文章

requests使用指南

requests使用指南

requests是一个简单易用的HTTP库,用于发送各种HTTP请求。下面我将详细介绍如何使用它。

安装requests

1
pip install 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客户端库之一。根据你的具体需求选择合适的方法即可。

本文由作者按照 CC BY 4.0 进行授权