requests 是一个为人类设计的、优雅且简单的 HTTP 库,相比于 Python 内置的 urllib 模块,requests 的 API 更加简洁直观,极大地简化了 HTTP 请求的发送和处理过程。
为什么使用 requests?
在深入细节之前,先理解为什么 requests 如此受欢迎:
- 简洁易用:API 设计非常直观,几行代码就能完成复杂的 HTTP 请求。
- 功能强大:支持 GET、POST、PUT、DELETE、HEAD、OPTIONS 等所有 HTTP 方法。
- 自动解码:自动处理响应内容的编码(如 gzip, deflate),你无需手动处理。
- 会话管理:通过
Session对象,可以跨请求保持某些参数(如 cookies, headers)。 - JSON 处理:内置了
response.json()方法,能轻松将 JSON 响应解析为 Python 字典。 - 完善的文档:拥有非常清晰和详尽的官方文档。
安装 requests
如果你的 Python 环境中还没有安装 requests,可以通过 pip 进行安装:
pip install requests
核心用法:发送请求
requests 的核心就是向指定的 URL 发送 HTTP 请求,并获取服务器的响应,最常用的方法是 requests.get(),但其他方法(如 post, put, delete)的使用方式也完全类似。
1 发送 GET 请求
GET 请求通常用于从服务器获取数据。
import requests
# 目标 URL
url = 'https://api.github.com'
# 发送 GET 请求
response = requests.get(url)
# --- 检查请求是否成功 ---
# response 对象有一个 `status_code` 属性,表示 HTTP 状态码
# 200 表示成功
if response.status_code == 200:
print("请求成功!")
# --- 获取响应内容 ---
# response.text 获取响应的文本内容(str 类型)
# print(response.text) # 通常是一大段 JSON 或 HTML 文本
# response.json() 将响应内容直接解析为 Python 字典 (如果响应是 JSON 格式)
# 这是 requests 最方便的功能之一
data = response.json()
print(f"API 返回的版本信息: {data.get('version')}")
# response.content 获取响应内容的字节形式 (bytes)
# 适用于下载图片、文件等二进制数据
# print(response.content)
# response.headers 获取响应头信息 (一个类字典对象)
print(f"响应头: {response.headers}")
else:
print(f"请求失败,状态码: {response.status_code}")
2 发送 POST 请求
POST 请求通常用于向服务器提交数据,例如表单数据、JSON 数据等。
import requests
import json
url = 'https://httpbin.org/post' # 一个用于测试 HTTP 请求的网站
# --- 准备要发送的数据 ---
# 1. 发送表单数据 (application/x-www-form-urlencoded)
# form_data = {'key1': 'value1', 'key2': 'value2'}
# 2. 发送 JSON 数据 (application/json)
json_data = {'name': 'Alice', 'age': 30, 'city': 'New York'}
# 发送 POST 请求
# 使用 `json` 参数会自动将字典转换为 JSON 字符串,
# 并设置正确的 Content-Type 头为 'application/json'
response = requests.post(url, json=json_data)
if response.status_code == 200:
print("POST 请求成功!")
# httpbin.org 会将你发送的数据和接收到的数据都返回给你
response_data = response.json()
print("服务器收到的 JSON 数据:")
print(json.dumps(response_data.get('json'), indent=2))
else:
print(f"POST 请求失败,状态码: {response.status_code}")
请求参数、请求头和 Cookies
在实际开发中,我们经常需要发送自定义的请求头、URL 查询参数和 Cookies。
1 URL 查询参数
使用 params 参数,它会自动将字典转换为 URL 查询字符串。
import requests
url = 'https://httpbin.org/get'
# 要发送的查询参数
params = {
'query': 'python requests',
'page': 1,
'per_page': 10
}
response = requests.get(url, params=params)
if response.status_code == 200:
print("带参数的 GET 请求成功!")
# httpbin.org 会将请求的 URL 和参数都返回
print("最终的请求 URL:", response.json().get('url'))
2 请求头
使用 headers 参数来添加或修改请求头,这对于模拟浏览器、设置认证信息等场景非常重要。
import requests
url = 'https://httpbin.org/get'
# 自定义请求头
headers = {
'User-Agent': 'My Cool App 1.0',
'Accept': 'application/json',
'X-Custom-Header': 'This is a custom value'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
print("带自定义头的 GET 请求成功!")
# httpbin.org 会返回你发送的请求头
print("服务器收到的请求头:", response.json().get('headers'))
3 Cookies
使用 cookies 参数来发送 Cookies。
import requests
url = 'https://httpbin.org/cookies'
# 要发送的 Cookies
cookies_to_send = {
'session_id': '12345abcde',
'user_token': 'xyz987'
}
# requests.CookiesJar 也可以用来管理更复杂的 cookies
# from http import cookies
# jar = cookies.SimpleCookie()
# jar['session_id'] = '12345abcde'
# ...
response = requests.get(url, cookies=cookies_to_send)
if response.status_code == 200:
print("带 Cookies 的 GET 请求成功!")
# httpbin.org 会返回你发送的 cookies
print("服务器收到的 Cookies:", response.json().get('cookies'))
高级功能:会话对象 (Session)
Session 对象可以在多个请求之间保持某些参数,cookies,这对于需要登录状态的网站(如爬虫)非常有用。
一个 Session 对象会为你提供一个“会话上下文”,你在这个上下文中发出的所有请求都会共享相同的 cookies。
import requests
# 创建一个 Session 对象
session = requests.Session()
# 1. 首先发送一个请求,获取并保存 cookies (登录)
# 假设登录接口会设置一个 session_id cookie
login_url = 'https://httpbin.org/cookies/set'
login_data = {'session_id': 'my_session_token'}
# 使用 session 发送登录请求
session.post(login_url, data=login_data)
print("登录请求已发送,session 已保存 cookies。")
# 2. 之后的所有请求都会自动带上这个 cookie
protected_url = 'https://httpbin.org/cookies' # 这个接口会返回请求中包含的所有 cookies
response = session.get(protected_url)
if response.status_code == 200:
print("使用 Session 发起的后续请求成功!")
print("服务器返回的 Cookies:", response.json().get('cookies'))
# 你会看到 'session_id': 'my_session_token' 仍然存在
# 如果用普通的 requests.get,则不会有这个 cookie
response_no_session = requests.get(protected_url)
print("\n不使用 Session 的请求返回的 Cookies:", response_no_session.json().get('cookies'))
处理异常
网络请求充满了不确定性,可能会因为各种原因失败(如网络错误、URL 不存在、服务器错误等)。requests 提供了专门的异常类来处理这些情况。
最常用的是 requests.exceptions.RequestException,它是所有 requests 相关异常的基类。
import requests
from requests.exceptions import RequestException, HTTPError, ConnectionError, Timeout
url = 'https://this-url-does-not-exist.com'
try:
# 设置一个超时时间,防止程序无限等待
response = requests.get(url, timeout=5)
# 如果响应的状态码是 4xx 或 5xx,raise_for_status() 会抛出 HTTPError
response.raise_for_status()
except HTTPError as http_err:
print(f"HTTP 错误发生: {http_err}")
except ConnectionError as conn_err:
print(f"连接错误发生: {conn_err}")
except Timeout as timeout_err:
print(f"请求超时: {timeout_err}")
except RequestException as req_err:
# 捕获所有 requests 相关的异常
print(f"请求发生错误: {req_err}")
else:
# 如果没有异常发生,则执行这里的代码
print("请求成功!")
print(response.text)
完整示例:爬取一个简单的网页
这个示例综合了 GET 请求、自定义请求头、处理文本和异常。
import requests
from requests.exceptions import RequestException
def fetch_webpage(url):
"""
爬取指定 URL 的网页内容
"""
# 设置一个常见的 User-Agent,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
try:
print(f"正在尝试访问: {url}")
# 发送 GET 请求,设置超时和自定义头
response = requests.get(url, headers=headers, timeout=10)
# 如果状态码不是 200,则引发异常
response.raise_for_status()
# 获取网页的文本内容
# requests 会自动根据响应头判断编码 (如 Content-Type 中的 charset)
# 如果自动判断失败,可以手动指定 encoding=response.apparent_encoding
html_content = response.text
return html_content
except RequestException as e:
print(f"访问网页时出错: {e}")
return None
# --- 使用示例 ---
target_url = 'https://www.python.org'
content = fetch_webpage(target_url)
if content:
print("\n成功获取网页内容!")
# 打印前 500 个字符
print(content[:500])
# 查找 "Download" 字符串出现的位置
print("\n'Download' 首次出现的位置:", content.find('Download'))
| 功能 | 方法/属性 | 描述 |
|---|---|---|
| 发送请求 | requests.get(url), requests.post(url, ...) |
发送 HTTP 请求 |
| 响应状态 | response.status_code |
获取 HTTP 状态码 (200, 404, 500...) |
response.text |
获取响应的文本内容 (自动解码) | |
response.json() |
将 JSON 响应解析为 Python 字典 | |
response.content |
获取响应内容的字节形式 (用于二进制文件) | |
| 请求参数 | requests.get(url, params={'key': 'value'}) |
添加 URL 查询参数 |
| 请求头 | requests.get(url, headers={'User-Agent': '...'}) |
添加/修改请求头 |
| Cookies | requests.get(url, cookies={'key': 'value'}) |
发送 Cookies |
| 会话管理 | session = requests.Session() |
创建会话对象,用于保持 cookies 和参数 |
| 异常处理 | try...except requests.exceptions.RequestException |
捕获请求过程中的各种错误 |
| 超时设置 | requests.get(url, timeout=5) |
设置请求超时时间(秒) |
requests 是 Python 开发者必备的工具之一,掌握它,你就可以轻松地与任何提供 HTTP API 的服务进行交互。
