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 对象常用属性和方法

属性/方法 说明 返回值类型
response.status_code HTTP 状态码 int
response.text 响应文本(字符串) str
response.content 响应字节内容 bytes
response.json() 解析 JSON 响应 dict/list
response.headers 响应头字典 CaseInsensitiveDict
response.cookies 响应中的 Cookie RequestsCookieJar
response.raise_for_status() 状态码非 2xx 时抛出异常 None / HTTPError

五、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}')
异常类型 触发场景 处理建议
Timeout 请求超过设定的超时时间 重试或增加超时时间
ConnectionError DNS 解析失败、拒绝连接等 检查网络、URL、代理设置
HTTPError 响应状态码为 4xx 或 5xx 检查请求参数、认证信息
RequestException 所有请求异常的基类 作为兜底捕获未知异常

八、请求头与代理设置

代理服务器配置

在某些网络环境下,需要通过代理服务器发送请求:

代码示例

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,适合需要登录态的场景。

标签: Python requests HTTP请求 网络编程 GET请求 POST请求

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python urllib详解 - HTTP请求标准库实战教程 下一篇: Python RESTful API调用教程 - JSON交互与认证

poll相关推荐