实战破解前端渲染:当 Requests 无法获取数据时(Selenium/Playwright 入门)
很多刚接触 Python 爬虫的朋友,都会从requests
库开始 —— 发送请求、获取 HTML、解析数据,一套流程下来顺风顺水。但突然某天爬某个网站时,会发现requests
拿到的 HTML 里空空如也,目标数据(比如商品价格、排行榜名次)完全找不到。这时候别慌,不是你代码写错了,而是遇到了「前端渲染」的 “拦路虎”。
一、为什么 Requests 会 “失灵”?先搞懂前端渲染
要解决问题,得先明白问题根源。我们先分清两种网页渲染方式:
1. 传统服务端渲染:Requests 的 “舒适区”
早期网站大多是「服务端渲染」—— 你访问网址时,服务器直接把完整的 HTML(包含所有文字、数据)生成好,打包发给浏览器。这时候requests
发送请求,拿到的就是最终展示的 HTML,直接解析就能拿到数据,比如爬静态博客、纯文字新闻页。
2. 现代前端渲染:Requests 的 “盲区”
现在很多网站(尤其是电商、社交、数据平台)用「前端渲染」—— 服务器只发一个 “空架子” HTML,里面只有基本结构,没有实际数据。真正的数据要等浏览器加载完 JavaScript(JS)后,由 JS 动态从服务器拉取数据,再渲染到页面上。
而requests
的短板就在这:它只能模拟 “发送请求 - 拿 HTML” 的过程,不会执行 JS 代码。所以它拿到的永远是 “空架子”,自然找不到动态加载的数据。这时候就需要工具帮我们 “模拟浏览器行为”—— 不仅发请求,还能执行 JS、等待渲染完成,这就是 Selenium 和 Playwright 的用武之地。
二、入门 Selenium:用 “模拟浏览器” 破解渲染
Selenium 是老牌自动化测试工具,核心能力是 “操控浏览器”—— 打开浏览器、输入文字、点击按钮,就像人手动操作一样。因为它能让浏览器执行 JS,所以能拿到前端渲染后的完整数据。
1. 环境搭建:两步走
Selenium 需要 “库 + 浏览器驱动” 配合,以 Chrome 浏览器为例:
第一步:安装 Selenium 库
用 pip 直接装:
bash
pip install selenium
第二步:下载 Chrome 驱动(关键!)
Chrome 驱动是 Selenium 操控 Chrome 的 “桥梁”,必须和你的 Chrome 版本对应:
- 打开 Chrome,在地址栏输入
chrome://settings/help
,查看 Chrome 版本(比如 “128.0.6613.137”); - 去Chrome 驱动官网下载对应版本的驱动(如果官网进不去,可搜 “ChromeDriver 国内镜像”);
- 把下载的驱动文件(比如
chromedriver.exe
)放到 Python 安装目录,或在代码里指定驱动路径。
2. 第一个 Selenium 脚本:打开网页验证
先写个简单脚本,确认环境没问题:
python
from selenium import webdriver# 1. 初始化Chrome浏览器(如果驱动在环境变量里,不用写executable_path)
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")# 2. 打开目标网页(比如豆瓣电影榜,动态加载数据)
driver.get("https://movie.douban.com/chart")# 3. 打印页面标题,验证是否打开成功
print("页面标题:", driver.title)# 4. 关闭浏览器(一定要关,否则会残留进程)
driver.quit()
运行后会自动打开 Chrome,跳转到豆瓣电影榜,控制台打印标题 —— 这说明 Selenium 已经能操控浏览器了。
3. 实战:爬取豆瓣电影榜动态数据
豆瓣电影榜的电影名称、评分是 JS 动态加载的,用requests
拿不到,用 Selenium 就能解决。核心是 “等待元素加载完成”(避免 JS 还没渲染完就去查元素):
python
from selenium import webdriver
from selenium.webdriver.common.by import By # 用于定位元素
from selenium.webdriver.support.ui import WebDriverWait # 显式等待
from selenium.webdriver.support import expected_conditions as EC # 等待条件# 初始化浏览器
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
try:# 打开豆瓣电影榜driver.get("https://movie.douban.com/chart")# 关键:显式等待——等待电影列表元素加载,最多等10秒# 这里用CSS选择器定位“电影条目”(可通过浏览器F12查看元素)wait = WebDriverWait(driver, 10)movie_list = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".item")))# 提取数据for movie in movie_list:# 定位电影名称(CSS选择器:.title a)title = movie.find_element(By.CSS_SELECTOR, ".title a").text# 定位评分(CSS选择器:.rating_nums)score = movie.find_element(By.CSS_SELECTOR, ".rating_nums").textprint(f"电影:{title} | 评分:{score}")
finally:# 不管成功失败,都关闭浏览器driver.quit()
运行后,你会看到 Chrome 自动打开页面,等待几秒后,控制台输出所有电影的名称和评分 —— 这就是前端渲染后的数据!
4. Selenium 避坑指南
- 驱动版本不匹配:最常见错误!如果报错 “session not created”,先检查 Chrome 版本和驱动版本是否一致;
- 等待时间不够:不要用
time.sleep()
(固定等几秒,不稳定),一定要用WebDriverWait
显式等待,等元素出现再操作; - 浏览器残留:每次脚本结束必须调用
driver.quit()
,否则任务管理器里会有很多 Chrome 进程。
三、入门 Playwright:更省心的 “新一代工具”
Selenium 虽然好用,但 “手动装驱动”“手动处理等待” 对新手不够友好。微软推出的 Playwright 解决了这些痛点 —— 自动管理驱动、自动等待元素,API 更简洁,新手入门更快。
1. 环境搭建:一步到位
Playwright 不需要手动下载驱动,安装时会自动搞定:
第一步:安装 Playwright 库
bash
pip install playwright
第二步:自动安装浏览器和驱动
运行这条命令,Playwright 会自动下载 Chrome、Firefox、Safari 的驱动(第一次运行有点慢,耐心等):
bash
playwright install
如果下载慢,可换国内源(先设置环境变量,再执行playwright install
):
bash
# Windows命令行
set PLAYWRIGHT_DOWNLOAD_HOST=https://playwright-assets.dp.tech
# Mac/Linux终端
export PLAYWRIGHT_DOWNLOAD_HOST=https://playwright-assets.dp.tech
2. 第一个 Playwright 脚本:页面截图
Playwright 支持 “同步” 和 “异步” 两种写法,新手先学同步(更简单):
python
from playwright.sync_api import sync_playwright# 用with语句管理Playwright,自动释放资源(不用手动关浏览器)
with sync_playwright() as p:# 启动Chrome浏览器(headless=False:显示浏览器窗口,方便调试)browser = p.chromium.launch(headless=False)# 新建一个标签页page = browser.new_page()# 打开知乎首页page.goto("https://www.zhihu.com")# 截图保存(验证页面是否加载成功)page.screenshot(path="zhihu.png")# 关闭浏览器browser.close()
运行后会打开 Chrome,跳转到知乎,自动截图保存为zhihu.png
—— 整个过程不用管驱动,非常省心。
3. 实战:爬取电商动态商品价格
以某电商平台的 “热销商品” 为例(数据动态加载),用 Playwright 爬取商品名和价格:
python
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:# 启动Chrome,无头模式(headless=True:不显示浏览器窗口,更节省资源)browser = p.chromium.launch(headless=True)page = browser.new_page()# 打开目标页面(这里用示例链接,实际替换为真实电商页)page.goto("https://example.com/hot-products")# 关键:Playwright会自动等待元素加载,也可显式等(更稳妥)# 等待商品列表元素出现,最多等8秒page.wait_for_selector(".hot-product-item", timeout=8000)# 提取数据:用query_selector_all定位所有商品products = page.query_selector_all(".hot-product-item")for product in products:# 提取商品名(text_content():获取元素文本)name = product.query_selector(".product-name").text_content().strip()# 提取价格price = product.query_selector(".product-price").text_content().strip()print(f"商品:{name} | 价格:{price}")browser.close()
运行后,控制台会直接输出商品数据 —— 没有手动装驱动,没有复杂的等待配置,比 Selenium 更简洁!
4. Playwright 的核心优势
- 自动管理驱动:不用手动下载、匹配驱动,安装时一步搞定;
- 智能等待:默认会等待元素可操作(比如按钮能点击、文本能读取),不用手动写等待逻辑;
- 多浏览器支持:一行代码切换 Chrome、Firefox、Safari,不用改其他逻辑;
- 无头模式稳定:相比 Selenium,Playwright 的无头模式更流畅,不易报错。
四、Selenium vs Playwright:新手该选谁?
对比维度 | Selenium | Playwright |
---|---|---|
驱动管理 | 手动下载、匹配版本 | 自动安装、维护 |
等待机制 | 需手动写显式等待 | 智能自动等待 |
API 简洁度 | 较繁琐(多导入模块) | 简洁(单模块搞定) |
学习成本 | 较高(需记等待、定位细节) | 较低(新手易上手) |
生态资料 | 丰富(老牌工具) | 较新(但官方文档很全) |
新手推荐优先学 Playwright:不用踩 “驱动匹配” 的坑,API 简单,能快速解决 “爬不到动态数据” 的问题;如果需要对接旧项目(很多公司用 Selenium 做自动化测试),再补充学习 Selenium。
五、总结与进阶方向
当requests
拿不到数据时,记住核心思路:用工具模拟浏览器行为,执行 JS 并等待前端渲染完成。Selenium 和 Playwright 都是实现这个思路的入门工具,掌握后能解决 80% 的前端渲染爬取需求。
后续可以往这些方向进阶:
- 反反爬优化:设置浏览器 User-Agent、添加代理 IP,避免被网站封禁;
- 页面交互:模拟点击按钮、输入搜索关键词(比如爬 “点击加载更多” 的数据);
- 效率提升:用多线程 / 多进程同时操控多个浏览器,加快爬取速度;
- 无头模式优化:生产环境用无头模式(不显示浏览器),节省服务器资源。
从 “爬不到数据” 到 “轻松获取动态数据”,只差一个 “模拟浏览器” 的工具 —— 动手试试上面的代码,你会发现前端渲染的 “坑” 其实很好填!