Python浏览器自动化:Selenium与Playwright实战对比,网页爬虫&自动操作一站式指南

Python浏览器自动化:Selenium与Playwright实战对比,网页爬虫&自动操作一站式指南

前言

在日常开发场景里,我们经常遇到需要模拟真人操作浏览器的需求:自动登录网站、表单批量提交、动态页面数据抓取、网页功能自动化测试、定时报表导出等。

普通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 核心特点

✅ 优点

  1. 生态成熟,网上教程、问题解决方案海量

  2. 支持Chrome、Edge、Firefox、Safari几乎所有主流浏览器

  3. 支持旧项目兼容,很多传统自动化测试平台基于Selenium搭建

❌ 缺点

  1. 架构多一层Driver转发,速度偏慢

  2. 元素等待需要手动写WebDriverWait,写大量样板代码

  3. 容易受浏览器版本更新影响,偶尔出现驱动兼容bug

  4. 对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 核心亮点

✅ 优点

  1. 内置智能等待,大幅减少超时、找不到元素问题

  2. 自带录制工具:playwright codegen,录制浏览器操作自动生成Python代码,快速写脚本

  3. 原生支持Shadow DOM、iframe、现代React/Vue页面

  4. 支持网络拦截、修改请求头、模拟移动端设备、代理、截图/录屏

  5. 无需单独驱动,一键安装浏览器内核

❌ 缺点

  1. 生态相对Selenium年轻,老旧教程较少

  2. 打包成exe程序体积很大(内置浏览器内核)

  3. 不支持原生Safari(WebKit内核是Playwright自带版本)

三、Selenium vs Playwright 选型对照表

特性 Selenium Playwright
开发维护 社区老牌,维护稳定 微软维护,更新活跃
驱动 需要浏览器driver 内置,无需额外驱动
等待机制 需要手动写显式等待 内置自动等待
SPA页面适配 一般,定位麻烦 优秀,支持ShadowDOM
录制脚本 无官方录制 codegen一键录制
执行速度 较慢 更快
浏览器支持 全浏览器 Chromium/Firefox/WebKit
学习资料 海量 逐年增多

👉 选型建议

  1. 新项目、网页自动化、动态页面爬虫:优先 Playwright,开发效率高、稳定性好

  2. 老自动化测试项目维护、需要兼容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")

⚠️ 高频坑总结

  1. 元素定位不要用绝对Xpath:页面一改直接失效,优先id、class、文本定位

  2. 不要用time.sleep()硬等待:网络波动会导致脚本不稳定,用框架自带等待

  3. 无头模式容易被网站识别:需要配置浏览器指纹、UA

  4. 资源释放:一定要调用quit() / close(),否则浏览器残留进程占用内存

  5. 登录记住Cookie:Playwright支持存储上下文Cookie,实现免重复登录

五、适用边界:什么时候不该用浏览器自动化?

浏览器自动化性能开销很大,启动浏览器占用内存CPU。

  • 静态网页、接口数据:优先 requests + BeautifulSoup / lxml,轻量速度快

  • 简单接口请求:用httpx,完全没必要拉起浏览器

  • 大规模分布式爬虫:浏览器自动化成本太高,慎重使用

浏览器自动化适合:JS渲染页面、需要交互点击、滑块、登录、表单提交这类强交互场景。

六、总结

Python浏览器自动化两大方案,Selenium稳如老狗,Playwright是现代首选。

Playwright的自动等待、代码录制、强大的页面处理能力,在动态网页操作场景碾压Selenium,现在个人开发、新项目基本优先Playwright;Selenium更多用于维护存量自动化测试系统。

浏览器自动化是一把双刃剑,强大但有法律边界。仅在授权的系统内使用,控制请求频率,不要恶意对网站进行压力测试。

拓展学习方向

  1. Playwright 网络拦截,捕获接口请求

  2. 代理IP池 + 浏览器指纹伪装

  3. 结合pytest做UI自动化测试

  4. 验证码识别集成(ddddocr)

相关推荐
Zip-List1 小时前
工作小记-pytorch的算子优化: 转gpu核函数 python调c
c语言·c++·pytorch·python·cuda
隐擎fox1 小时前
解密 BGP Anycast 边缘路由与跨国链路质量检测:多租户网络出口的低时延与防丢包架构实战
网络·python·网络协议·tcp/ip·网络安全·架构·tcpdump
土豆.exe1 小时前
chunked 编码的行尾:Go、h11 与 Tomcat 各错在哪一处
开发语言·网络安全·golang·tomcat
磊 子1 小时前
什么是虚假唤醒(spurious wakeup)?从 POSIX 标准讲到 futex 内核
java·开发语言
把我格子衫拿来1 小时前
手眼标定:相机与机械臂如何建立坐标关系?从 AX=XB 到 OpenCV 实践
python·opencv·机器人·手眼标定·坐标变换
飘然生1 小时前
traceId链路 skywalking java agent
java·开发语言·skywalking
li星野1 小时前
【学习记录】射线补偿原理与实现:从物理模型到MATLAB代码
开发语言·学习·matlab
把我格子衫拿来1 小时前
相机标定误差很小,为什么测量仍不准?从 OpenCV 重投影误差到独立验证
python·数码相机·opencv·计算机视觉·相机标定
goehou1 小时前
流式输出实战:SSE 解析、chunk 拼装与断流重试
python·ai·llm·sse·流式