Python浏览器自动化:Selenium与Playwright实战对比,网页爬虫&自动操作一站式指南
- 前言
- 一、Selenium:老牌经典浏览器自动化框架
-
- [1. 环境安装](#1. 环境安装)
- [2. 基础示例:打开网页,查找元素,模拟点击](#2. 基础示例:打开网页,查找元素,模拟点击)
- [3. Selenium 核心特点](#3. Selenium 核心特点)
- 二、Playwright:微软新一代自动化框架(强烈推荐新项目)
-
- [1. 环境安装](#1. 环境安装)
- [2. 同步API示例:访问网页,表单输入](#2. 同步API示例:访问网页,表单输入)
- [3. 异步写法(高并发场景推荐)](#3. 异步写法(高并发场景推荐))
- [4. Playwright 核心亮点](#4. Playwright 核心亮点)
- [三、Selenium vs Playwright 选型对照表](#三、Selenium vs Playwright 选型对照表)
- [四、高频场景实战 & 常见踩坑](#四、高频场景实战 & 常见踩坑)
-
- 场景1:无头模式(后台运行,不弹出浏览器窗口)
- 场景2:反爬基础绕过(简单网站,仅基础伪装)
- [⚠️ 高频坑总结](#⚠️ 高频坑总结)
- 五、适用边界:什么时候不该用浏览器自动化?
- 六、总结
前言
在日常开发场景里,我们经常遇到需要模拟真人操作浏览器的需求:自动登录网站、表单批量提交、动态页面数据抓取、网页功能自动化测试、定时报表导出等。
普通requests库只能发送HTTP请求,无法执行JS、渲染页面、处理验证码弹窗、点击下拉菜单这类浏览器端行为。而Python浏览器自动化库,就是直接驱动真实浏览器内核,像人一样操作页面。
目前生态最主流的两大方案:Selenium 和 Playwright。很多初学者纠结该选哪个,本文从原理、代码示例、优缺点、踩坑点一次性讲清楚。
⚠️ 重要提醒:本文技术仅用于自己拥有权限的网站、内部管理系统测试。未经授权爬取、自动化操作第三方网站,可能违反网站协议甚至法律法规,请遵守《网络安全法》,不要滥用。
一、Selenium:老牌经典浏览器自动化框架
Selenium 是自动化领域的元老,诞生多年,社区资料极多,几乎所有语言都支持。
原理:启动浏览器驱动(ChromeDriver/EdgeDriver),驱动作为中间服务,接收Python指令,控制浏览器。
1. 环境安装
bash
pip install selenium
Selenium4.6+ 版本自带自动管理浏览器驱动,不再需要手动下载chromedriver,底层会自动匹配浏览器版本,省去大量版本不匹配的坑。
2. 基础示例:打开网页,查找元素,模拟点击
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
# 初始化Chrome浏览器
driver = webdriver.Chrome()
# 设置页面加载超时
driver.set_page_load_timeout(10)
try:
# 访问网页
driver.get("https://www.baidu.com")
# 显式等待:等待搜索输入框加载完成,最多等待5秒
search_input = WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.ID, "kw"))
)
# 输入关键词
search_input.send_keys("Python浏览器自动化")
# 点击搜索按钮
driver.find_element(By.ID, "su").click()
# 获取页面标题与源码
print("页面标题:", driver.title)
finally:
# 关闭浏览器,释放资源
driver.quit()
3. Selenium 核心特点
✅ 优点
-
生态成熟,网上教程、问题解决方案海量
-
支持Chrome、Edge、Firefox、Safari几乎所有主流浏览器
-
支持旧项目兼容,很多传统自动化测试平台基于Selenium搭建
❌ 缺点
-
架构多一层Driver转发,速度偏慢
-
元素等待需要手动写
WebDriverWait,写大量样板代码 -
容易受浏览器版本更新影响,偶尔出现驱动兼容bug
-
对iframe、ShadowDOM、现代前端框架(Vue/React)页面定位比较麻烦
二、Playwright:微软新一代自动化框架(强烈推荐新项目)
Playwright是微软开源的浏览器自动化库,2020年后快速火爆,原生支持Chrome、Firefox、WebKit内核,不需要单独驱动程序,内置自动等待机制,对现代SPA单页应用友好。
底层直接调用浏览器内核API,跳过中间驱动层,稳定性和速度优于Selenium。
1. 环境安装
bash
pip install playwright
# 自动下载三个浏览器内核(Chromium、Firefox、Webkit)
playwright install
2. 同步API示例:访问网页,表单输入
python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 启动Chromium浏览器,headless=False 显示浏览器窗口;True无头后台运行
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# 打开百度
page.goto("https://www.baidu.com")
# 定位输入框并输入内容,Playwright自带自动等待,无需手动写等待条件
page.locator("#kw").fill("Python Playwright自动化")
page.locator("#su").click()
# 获取页面标题
print(page.title())
# 截图保存
page.screenshot(path="baidu_result.png")
browser.close()
Playwright 最强大的特性:自动等待 。在点击、输入、获取元素时,会自动等待元素可见、可点击,避免Selenium大量的等待代码,大幅减少
element not found报错。
3. 异步写法(高并发场景推荐)
python
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto("https://www.baidu.com")
await page.locator("#kw").fill("异步Playwright")
await page.locator("#su").click()
print(await page.title())
await browser.close()
if __name__ == "__main__":
asyncio.run(main())
4. Playwright 核心亮点
✅ 优点
-
内置智能等待,大幅减少超时、找不到元素问题
-
自带录制工具:
playwright codegen,录制浏览器操作自动生成Python代码,快速写脚本 -
原生支持Shadow DOM、iframe、现代React/Vue页面
-
支持网络拦截、修改请求头、模拟移动端设备、代理、截图/录屏
-
无需单独驱动,一键安装浏览器内核
❌ 缺点
-
生态相对Selenium年轻,老旧教程较少
-
打包成exe程序体积很大(内置浏览器内核)
-
不支持原生Safari(WebKit内核是Playwright自带版本)
三、Selenium vs Playwright 选型对照表
| 特性 | Selenium | Playwright |
|---|---|---|
| 开发维护 | 社区老牌,维护稳定 | 微软维护,更新活跃 |
| 驱动 | 需要浏览器driver | 内置,无需额外驱动 |
| 等待机制 | 需要手动写显式等待 | 内置自动等待 |
| SPA页面适配 | 一般,定位麻烦 | 优秀,支持ShadowDOM |
| 录制脚本 | 无官方录制 | codegen一键录制 |
| 执行速度 | 较慢 | 更快 |
| 浏览器支持 | 全浏览器 | Chromium/Firefox/WebKit |
| 学习资料 | 海量 | 逐年增多 |
👉 选型建议
-
新项目、网页自动化、动态页面爬虫:优先 Playwright,开发效率高、稳定性好
-
老自动化测试项目维护、需要兼容Safari旧版本:使用Selenium
四、高频场景实战 & 常见踩坑
场景1:无头模式(后台运行,不弹出浏览器窗口)
Selenium无头:
python
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless=new")
driver = webdriver.Chrome(options=chrome_options)
Playwright直接设置headless=True。
场景2:反爬基础绕过(简单网站,仅基础伪装)
仅修改UA,不能对抗专业反爬系统。
Playwright修改User-Agent:
python
page = browser.new_page(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
⚠️ 高频坑总结
-
元素定位不要用绝对Xpath:页面一改直接失效,优先id、class、文本定位
-
不要用
time.sleep()硬等待:网络波动会导致脚本不稳定,用框架自带等待 -
无头模式容易被网站识别:需要配置浏览器指纹、UA
-
资源释放:一定要调用
quit()/close(),否则浏览器残留进程占用内存 -
登录记住Cookie:Playwright支持存储上下文Cookie,实现免重复登录
五、适用边界:什么时候不该用浏览器自动化?
浏览器自动化性能开销很大,启动浏览器占用内存CPU。
-
静态网页、接口数据:优先 requests + BeautifulSoup / lxml,轻量速度快
-
简单接口请求:用httpx,完全没必要拉起浏览器
-
大规模分布式爬虫:浏览器自动化成本太高,慎重使用
浏览器自动化适合:JS渲染页面、需要交互点击、滑块、登录、表单提交这类强交互场景。
六、总结
Python浏览器自动化两大方案,Selenium稳如老狗,Playwright是现代首选。
Playwright的自动等待、代码录制、强大的页面处理能力,在动态网页操作场景碾压Selenium,现在个人开发、新项目基本优先Playwright;Selenium更多用于维护存量自动化测试系统。
浏览器自动化是一把双刃剑,强大但有法律边界。仅在授权的系统内使用,控制请求频率,不要恶意对网站进行压力测试。

拓展学习方向
-
Playwright 网络拦截,捕获接口请求
-
代理IP池 + 浏览器指纹伪装
-
结合pytest做UI自动化测试
-
验证码识别集成(ddddocr)