在 Python 爬虫、API 开发、自动化测试等场景中,发送 HTTP 请求是高频需求。而 requests 库 凭借其简洁的语法、完善的功能和极佳的兼容性,成为了开发者处理 HTTP 请求的首选工具。它彻底解决了 Python 内置 urllib 库语法繁琐、操作复杂的痛点,让 “发送一个请求” 这件事变得像写英语句子一样简单。
本文将从基础到进阶,带大家全面掌握 requests 库的使用 —— 从环境安装到核心方法,从参数配置到实战案例,再到性能优化技巧,帮你快速上手并灵活应对各类业务场景。
一、为什么选择 requests 库?—— 它的核心优势
在学习使用前,我们先明确一个问题:Python 自带 urllib 库,为什么还要用 requests?答案藏在它的三大核心优势里:
语法极简,上手成本低
发送一个 GET 请求,urllib 需要构建 Request 对象、处理 URL 编码、捕获异常,而 requests 只需一行代码:requests.get(url),语义化的方法名(get/post/put)让代码可读性大幅提升。
功能全面,覆盖所有 HTTP 场景
支持 GET/POST/PUT/DELETE/HEAD/PATCH 等所有 HTTP 方法,内置 cookie 管理、会话保持、文件上传、代理设置、SSL 验证等功能,无需额外封装工具类。
异常处理友好,调试效率高
内置 HTTPError、ConnectionError 等细分异常类型,配合响应对象的 status_code(状态码)、text(响应内容)、headers(响应头)等属性,能快速定位请求问题(如 404 页面不存在、500 服务器错误)。
二、环境准备:5 分钟完成安装与验证
requests 是第三方库,需先通过包管理工具安装,支持 Windows/macOS/Linux 全平台。
1. 安装方式(二选一)
使用 pip(推荐,Python 自带):
打开终端 / 命令提示符,输入以下命令,等待安装完成:
pip install requests
如果提示 “pip 不是内部命令”,需先配置 Python 环境变量(或使用 python -m pip install requests)。
使用 Anaconda(适合数据分析用户):
若已安装 Anaconda,输入以下命令:
conda install requests
2. 验证安装是否成功
安装完成后,在终端输入 python 进入交互模式,执行以下代码:
import requests
response = requests.get("https://www.baidu.com")
print("请求状态码:", response.status_code) # 输出 200 表示安装成功且请求正常
若输出 请求状态码:200,说明 requests 库已正确安装并能正常发送请求。
三、核心功能详解:掌握 90% 场景的用法
requests 库的核心是围绕 HTTP 方法 设计的,不同方法对应不同的业务需求(如获取数据用 GET,提交数据用 POST)。下面我们逐一讲解高频用法。
1. 基础请求:GET 与 POST(最常用)
(1)GET 请求:获取数据(如爬取页面、调用查询类 API)
GET 请求的参数通常拼接在 URL 后(如 https://search.baidu.com/s?wd=python 中的 wd=python),requests 支持通过 params 参数自动拼接,无需手动处理 URL 编码。
示例:调用百度搜索 API(模拟搜索 “python”)
import requests
# 1. 定义请求 URL 和参数
url = "https://search.baidu.com/s"
params = {
"wd": "python", # 搜索关键词
"pn": 0 # 分页参数(0 表示第 1 页,10 表示第 2 页,以此类推)
}
# 2. 发送 GET 请求
response = requests.get(url, params=params)
# 3. 处理响应结果
print("请求的完整 URL:", response.url) # 查看参数是否自动拼接(输出:https://search.baidu.com/s?wd=python&pn=0)
print("响应状态码:", response.status_code) # 200 表示成功
print("响应内容(前 500 字符):", response.text[:500]) # 获取页面 HTML 内容
(2)POST 请求:提交数据(如登录、表单提交、上传文件)
POST 请求的参数通常放在请求体(Body)中,不暴露在 URL 里,安全性更高。根据服务器要求,参数格式可能是 form-data(表单)或 json(API 常用)。
场景 1:提交表单数据(form-data 格式)
import requests
url = "https://example.com/login" # 模拟登录接口
data = {
"username": "test_user",
"password": "123456"
}
# 发送 POST 请求(data 参数自动以 form-data 格式提交)
response = requests.post(url, data=data)
print("登录响应:", response.text)
场景 2:提交 JSON 数据(API 接口常用)
很多现代 API(如 RESTful API)要求请求体为 JSON 格式,此时需用 json 参数(requests 会自动设置 Content-Type: application/json 头):
import requests
url = "https://api.example.com/user" # 模拟用户注册 API
user_info = {
"name": "张三",
"age": 25,
"email": "zhangsan@example.com"
}
# 发送 JSON 格式的 POST 请求
response = requests.post(url, json=user_info)
print("注册结果:", response.json()) # 直接解析 JSON 响应(无需手动 json.loads())
2. 响应处理:获取你需要的所有信息
发送请求后,会得到一个 Response 对象(上文中的 response),它包含了服务器返回的所有信息。以下是常用属性和方法:
注意:若响应不是 JSON 格式,调用 json() 会报错,建议先判断 status_code 是否为 200,再解析内容。
3. 高级配置:应对复杂场景
在实际开发中,常需要设置请求头、超时时间、代理等,requests 提供了对应的参数支持。
(1)设置请求头(Headers)
很多网站会验证 User-Agent(标识请求来源,如浏览器 / 爬虫),若不设置,可能会被拒绝访问。示例:
import requests
url = "https://www.zhihu.com"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
"Referer": "https://www.baidu.com" # 模拟从百度跳转过来的请求
}
response = requests.get(url, headers=headers)
print("状态码:", response.status_code) # 正确设置后,状态码为 200(否则可能是 403 禁止访问)
(2)设置超时时间(Timeout)
为避免请求因网络问题一直阻塞,建议设置超时时间(单位:秒),超时后会抛出 Timeout 异常:
import requests
try:
# 10 秒内未响应则超时
response = requests.get("https://www.example.com", timeout=10)
except requests.exceptions.Timeout:
print("请求超时,请检查网络!")
(3)设置代理(Proxies)
爬虫场景中,为避免 IP 被封禁,常需要使用代理。requests 支持通过 proxies 参数配置 HTTP/HTTPS 代理:
import requests
url = "https://httpbin.org/ip" # 该网站会返回当前请求的 IP
proxies = {
"http": "http://127.0.0.1:8888", # HTTP 代理
"https": "https://127.0.0.1:8888" # HTTPS 代理
}
response = requests.get(url, proxies=proxies)
print("当前请求 IP:", response.json()["origin"]) # 输出代理 IP,说明配置成功
(4)会话保持(Session)
若需要连续发送多个请求(如登录后访问个人中心),且要求保持 Cookie,可使用 Session 对象,它会自动保存 Cookie,无需手动传递:
import requests
# 创建 Session 对象
session = requests.Session()
# 1. 第一步:登录(Session 会保存登录后的 Cookie)
login_url = "https://example.com/login"
session.post(login_url, data={"username": "test", "password": "123"})
# 2. 第二步:访问个人中心(自动携带登录 Cookie,无需额外处理)
user_center_url = "https://example.com/user/center"
response = session.get(user_center_url)
print("个人中心内容:", response.text)
四、实战案例:用 requests 爬取豆瓣电影 Top250
理论结合实践才是掌握的关键。下面我们用 requests 爬取豆瓣电影 Top250 的电影名称、评分和简介,巩固前面所学的知识。
1. 分析目标页面
豆瓣电影 Top250 地址:https://movie.douban.com/top250?start=0&filter=
start=0:第 1 页(0-24 条),start=25:第 2 页(25-49 条),以此类推。
页面数据直接嵌入 HTML 中,无需处理 JavaScript 渲染(适合入门)。
2. 代码实现(需配合 BeautifulSoup 解析 HTML)
import requests
from bs4 import BeautifulSoup # 需先安装:pip install beautifulsoup4
def get_douban_top250(page):
# 1. 配置请求参数
start = (page - 1) * 25 # 计算每页的起始位置
url = "https://movie.douban.com/top250"
params = {"start": start, "filter": ""}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}
# 2. 发送请求并解析 HTML
try:
response = requests.get(url, params=params, headers=headers, timeout=10)
response.raise_for_status() # 若状态码不是 200,抛出 HTTPError 异常
soup = BeautifulSoup(response.text, "html.parser")
# 3. 提取电影信息
movie_list = soup.find_all("div", class_="item") # 找到所有电影项
for movie in movie_list:
title = movie.find("span", class_="title").text # 电影名称
rating = movie.find("span", class_="rating_num").text # 评分
quote = movie.find("span", class_="inq") # 电影简介(部分电影无简介,需判断)
quote_text = quote.text if quote else "无简介"
print(f"电影名称:{title}\n评分:{rating}\n简介:{quote_text}\n" + "-"*50)
except Exception as e:
print(f"爬取第 {page} 页失败:{str(e)}")
# 爬取前 3 页(共 75 部电影)
for page in range(1, 4):
print(f"=== 正在爬取豆瓣 Top250 第 {page} 页 ===")
get_douban_top250(page)
3. 代码说明
用 BeautifulSoup 解析 HTML 结构,提取电影信息(若不了解 BeautifulSoup,可先学习其基础语法);
用 try-except 捕获请求异常(如网络错误、页面不存在),提高代码健壮性;
通过循环实现多页爬取,逻辑清晰且可复用。
五、注意事项与进阶技巧
1. 避免被反爬:遵守网站规则
不要频繁发送请求:可在请求间加入 time.sleep(1)(暂停 1 秒),模拟人类操作;
尊重 robots.txt:访问网站的 https://xxx.com/robots.txt,查看是否允许爬取目标页面;
轮换 User-Agent 和代理:避免单一标识被网站封禁。
2. 性能优化:批量请求用异步
requests 是同步库,若需要发送上千个请求,同步方式会非常慢。此时可结合 aiohttp(异步 HTTP 库)实现批量请求,效率提升 10 倍以上。示例(核心逻辑):
import aiohttp
import asyncio
async def fetch_url(session, url):
async with session.get(url) as response:
return await response.text()
async def batch_request(urls):
async with aiohttp.ClientSession() as session:
tasks = [fetch_url(session, url) for url in urls]
results = await asyncio.gather(*tasks) # 并发执行所有任务
return results
# 批量请求 10 个 URL
urls = [f"https://example.com/page/{i}" for i in range(1, 11)]
results = asyncio.run(batch_request(urls))
3. 常见问题排查
问题 1:状态码 403 Forbidden → 检查是否设置 User-Agent,或 IP 是否被封禁;
问题 2:响应内容乱码 → 用 response.encoding = response.apparent_encoding 自动识别编码;
问题 3:JSON 解析报错 → 先打印 response.text 查看实际响应内容,确认是否为 JSON 格式。
六、总结
requests 库是 Python 开发者处理 HTTP 请求的 “瑞士军刀”—— 它语法简洁、功能全面,既能满足新手快速发送请求的需求,也能支撑复杂场景(如会话保持、代理池)的开发。
通过本文的学习,你应该已经掌握了:
requests 库的安装与基础验证;
GET/POST 等核心请求方法的使用;
响应对象的解析与高级配置(请求头、超时、代理);
实战爬取豆瓣 Top250 的完整流程;
反爬技巧与性能优化方向。
如果需要进一步深入,建议查看 requests 官方文档,了解更多高级功能(如文件上传、身份验证)。动手实践是掌握的关键,不妨试着用 requests 调用一个公开 API(如天气 API、股票 API),巩固今天的知识吧!