软件科学-郝学胜头像
Python浏览器自动化:Selenium与Playwright实战对比,网页爬虫&自动操作一站式指南封面图

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

前言

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

普通requests库只能发送HTTP请求,无法执行JS、渲染页面、处理验证码弹窗、点击下拉菜单这类浏览器端行为。而Python浏览器自动化库,就是直接驱动真实浏览器内核,像人一样操作页面。

目前生态最主流的两大方案:Selenium 和 Playwright。很多初学者纠结该选哪个,本文从原理、代码示例、优缺点、踩坑点一次性讲清楚。

⚠️ 重要提醒:本文技术仅用于自己拥有权限的网站、内部管理系统测试。未经授权爬取、自动化操作第三方网站,可能违反网站协议甚至法律法规,请遵守《网络安全法》,不要滥用。

一、Selenium:老牌经典浏览器自动化框架

Selenium 是自动化领域的元老,诞生多年,社区资料极多,几乎所有语言都支持。

原理:启动浏览器驱动(ChromeDriver/EdgeDriver),驱动作为中间服务,接收Python指令,控制浏览器。

1. 环境安装

pip install selenium

Selenium4.6+ 版本自带自动管理浏览器驱动,不再需要手动下载chromedriver,底层会自动匹配浏览器版本,省去大量版本不匹配的坑。

2. 基础示例:打开网页,查找元素,模拟点击

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. 环境安装

pip install playwright
# 自动下载三个浏览器内核(Chromium、Firefox、Webkit)
playwright install

2. 同步API示例:访问网页,表单输入

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. 异步写法(高并发场景推荐)

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 选型对照表

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

👉 选型建议

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

  2. 老自动化测试项目维护、需要兼容Safari旧版本:使用Selenium

四、高频场景实战 & 常见踩坑

场景1:无头模式(后台运行,不弹出浏览器窗口)

Selenium无头:

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:

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更多用于维护存量自动化测试系统。

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

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

拓展学习方向

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

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

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

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

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2503_92624912/article/details/168145950

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--