浏览器自动化工具选型实战

1. 核心工具横向对比

特性 Playwright DrissionPage NoDriver Selenium
定位 企业级测试/高并发爬虫 国产全能瑞士军刀 极致反检测/异步 传统自动化测试
底层协议 CDP / WebDriver CDP / HTTP 混合 纯 CDP (无 WebDriver) WebDriver
反爬能力 ⭐⭐⭐ (需插件) ⭐⭐⭐⭐ (接管浏览器) ⭐⭐⭐⭐⭐ (原生无特征) ⭐⭐ (极易被识别)
上手难度 ⭐⭐⭐ (异步/同步双模式) ⭐ (语法极简,中文友好) ⭐⭐⭐⭐ (纯异步,门槛高) ⭐⭐ (API 繁琐)
性能 🚀 极快 (多上下文隔离) 🚀 快 (HTTP 模式极快) 🚀 极快 (无驱动开销) 🐢 较慢
核心杀手锏 自动等待、多浏览器支持、网络拦截 浏览器/HTTP 无缝切换、跨 iframe 查找 完全绕过 WebDriver 检测 生态庞大、历史资料多
适用语言 Python, JS, Java, C# Python Python (Async) 全语言

2. 场景决策树 🌳

#mermaid-svg-xkALUXRz1IlHYY1h{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xkALUXRz1IlHYY1h .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xkALUXRz1IlHYY1h .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xkALUXRz1IlHYY1h .error-icon{fill:#552222;}#mermaid-svg-xkALUXRz1IlHYY1h .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xkALUXRz1IlHYY1h .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xkALUXRz1IlHYY1h .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xkALUXRz1IlHYY1h .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xkALUXRz1IlHYY1h .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xkALUXRz1IlHYY1h .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xkALUXRz1IlHYY1h .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xkALUXRz1IlHYY1h .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xkALUXRz1IlHYY1h .marker.cross{stroke:#333333;}#mermaid-svg-xkALUXRz1IlHYY1h svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xkALUXRz1IlHYY1h p{margin:0;}#mermaid-svg-xkALUXRz1IlHYY1h .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xkALUXRz1IlHYY1h .cluster-label text{fill:#333;}#mermaid-svg-xkALUXRz1IlHYY1h .cluster-label span{color:#333;}#mermaid-svg-xkALUXRz1IlHYY1h .cluster-label span p{background-color:transparent;}#mermaid-svg-xkALUXRz1IlHYY1h .label text,#mermaid-svg-xkALUXRz1IlHYY1h span{fill:#333;color:#333;}#mermaid-svg-xkALUXRz1IlHYY1h .node rect,#mermaid-svg-xkALUXRz1IlHYY1h .node circle,#mermaid-svg-xkALUXRz1IlHYY1h .node ellipse,#mermaid-svg-xkALUXRz1IlHYY1h .node polygon,#mermaid-svg-xkALUXRz1IlHYY1h .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xkALUXRz1IlHYY1h .rough-node .label text,#mermaid-svg-xkALUXRz1IlHYY1h .node .label text,#mermaid-svg-xkALUXRz1IlHYY1h .image-shape .label,#mermaid-svg-xkALUXRz1IlHYY1h .icon-shape .label{text-anchor:middle;}#mermaid-svg-xkALUXRz1IlHYY1h .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xkALUXRz1IlHYY1h .rough-node .label,#mermaid-svg-xkALUXRz1IlHYY1h .node .label,#mermaid-svg-xkALUXRz1IlHYY1h .image-shape .label,#mermaid-svg-xkALUXRz1IlHYY1h .icon-shape .label{text-align:center;}#mermaid-svg-xkALUXRz1IlHYY1h .node.clickable{cursor:pointer;}#mermaid-svg-xkALUXRz1IlHYY1h .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xkALUXRz1IlHYY1h .arrowheadPath{fill:#333333;}#mermaid-svg-xkALUXRz1IlHYY1h .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xkALUXRz1IlHYY1h .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xkALUXRz1IlHYY1h .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xkALUXRz1IlHYY1h .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xkALUXRz1IlHYY1h .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xkALUXRz1IlHYY1h .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xkALUXRz1IlHYY1h .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xkALUXRz1IlHYY1h .cluster text{fill:#333;}#mermaid-svg-xkALUXRz1IlHYY1h .cluster span{color:#333;}#mermaid-svg-xkALUXRz1IlHYY1h div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xkALUXRz1IlHYY1h .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xkALUXRz1IlHYY1h rect.text{fill:none;stroke-width:0;}#mermaid-svg-xkALUXRz1IlHYY1h .icon-shape,#mermaid-svg-xkALUXRz1IlHYY1h .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xkALUXRz1IlHYY1h .icon-shape p,#mermaid-svg-xkALUXRz1IlHYY1h .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xkALUXRz1IlHYY1h .icon-shape .label rect,#mermaid-svg-xkALUXRz1IlHYY1h .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xkALUXRz1IlHYY1h .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xkALUXRz1IlHYY1h .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xkALUXRz1IlHYY1h :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
是
否
是
否
你的任务是什么?
需要绕过强风控?
选 NoDriver
需要高频切换接口/浏览器?
选 DrissionPage
是企业级测试/大型项目?
选 Playwright
需要维护10年前的老项目?
选 Selenium
默认选 DrissionPage 或 Playwright

💡 快速判断口诀:

  • 搞爬虫、要快、要省内存 ➡️ DrissionPage
  • 搞测试、要稳、要并发 ➡️ Playwright
  • 搞风控、要隐、要过盾 ➡️ NoDriver
  • 搞老项目、要查资料 ➡️ Selenium

3. 核心代码模板 📝

🅰️ DrissionPage:混合模式(最推荐爬虫用)

python 复制代码
from DrissionPage import WebPage

page = WebPage()
# 1. 浏览器模式:处理登录、验证码、复杂交互
page.get('https://example.com/login')
page.ele('#username').input('admin')
page.ele('#password').input('123456')
page.ele('@type=submit').click()

# 2. 无缝切换:利用已有 Cookie 高速抓包
page.change_mode()  
resp = page.get('https://api.example.com/data')
print(resp.json())

🅱️ Playwright:异步并发模板

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=True)
        # 并发打开多个上下文,互不干扰
        tasks = [scrape_page(browser, url) for url in urls]
        await asyncio.gather(*tasks)
        await browser.close()

async def scrape_page(browser, url):
    context = await browser.new_context()
    page = await context.new_page()
    await page.goto(url)
    # 自动等待元素出现,无需 sleep
    await page.wait_for_selector('.content')
    print(await page.title())
    await context.close()

asyncio.run(main())

🅲️ NoDriver:反检测启动模板

python 复制代码
import asyncio
import nodriver as uc

async def main():
    browser = await uc.start()
    page = await browser.get('https://bot.sannysoft.com/')
    # 原生无 WebDriver 特征,直接过检测
    await page.sleep(2) 
    await browser.stop()

asyncio.run(main())

4. 避坑与最佳实践 ⚠️

🚫 绝对不要做的事:

  1. 在循环里写 time.sleep(5) :所有现代工具都有 wait_for 或 ele().wait(),用智能等待代替死等。
  2. Selenium 硬刚抖音/淘宝 :除非你用了 undetected-chromedriver,否则原生 Selenium 100% 被识别。
  3. DrissionPage 混用同步/异步 :DrissionPage 是同步库,不要试图在 asyncio 里直接跑它,会卡死事件循环。

✅ 推荐工作流:

  1. Cookie 注入 :优先用 DrissionPage 的 page.set.cookies(cookie_string),比 Playwright 解析字典更方便。
  2. 资源拦截:Playwright 和 DrissionPage 都支持拦截图片/字体,爬虫务必开启,速度提升 300%。
  3. 指纹伪装 :NoDriver 默认伪装,Playwright 建议配合 playwright-stealth 插件使用。

5. 常用命令速查表

操作 DrissionPage Playwright (Sync) NoDriver
启动 ChromiumPage() p.chromium.launch() await uc.start()
访问 page.get(url) page.goto(url) await browser.get(url)
点击 page.ele('#id').click() page.click('#id') await ele.click()
输入 page.ele('#id').input('txt') page.fill('#id', 'txt') await ele.send_keys('txt')
等待 page.ele('#id').wait(10) page.wait_for_selector('#id') await page.sleep() / wait_for
获取文本 page.ele('#id').text page.text_content('#id') await ele.get_text()
执行JS page.run_js('return 1') page.evaluate('() => 1') await page.evaluate('1')

6. 扩展生态推荐

  • AI Agent 控制 :PinchTab (通过 HTTP API 控制浏览器,适合 LLM 调度)
  • Node.js 生态 :Puppeteer (Playwright 的前身,仅支持 Chromium)
  • 前端测试 :Cypress (运行在浏览器内部,调试体验极佳)
  • 纯 HTTP 爬虫 :httpx / curl_cffi (DrissionPage 的 SessionPage 底层就是它们)

💬 备注 :

如果遇到抖音/小红书等强风控,优先尝试 DrissionPage 接管本地浏览器 ,其次 NoDriver ,最后才考虑 Playwright + Stealth。

文档会持续更新,建议收藏。


相关推荐
工业传感笔记4 小时前
工业传感器国产替代的工程评估框架:从规格覆盖到工况验证的四个维度
其他·自动化
无敌糖果4 小时前
Nginx 后端error.log疯狂刷盘问题分析
运维·nginx
逐流人4 小时前
ELK企业级日志分析系统:从零搭建集中化日志平台
运维·elk·云原生·云计算·日志分析
Sayai4 小时前
Elasticsearch Rollup 汇算索引实战:监控指标多粒度预聚合查询,附 painless 时间窗取每日最新值
大数据·运维·elasticsearch·搜索引擎·性能优化·监控
乐橙开放平台4 小时前
门店监控想集中看?乐橙含光支持多品牌摄像头跨店管理
网络·笔记·物联网·自动化·音视频·智能家居
Z21-X5 小时前
云原生运维学习笔记:存储、网络与操作系统——云计算的底层基石
运维·笔记·学习·云原生
邪修king7 小时前
Re:Linux 系统篇(三十五):进程间通信Chapter2:从匿名管道到进程池:Linux 进程间通信实战(深度理解「先描述,再组织」)
java·linux·运维
运维行者_9 小时前
应用性能监控怎么选?从调用链到用户体验的五个能力维度
运维·服务器·数据库·人工智能·mysql·性能优化·应用性能监控
考虑考虑13 小时前
nginx路由重写
运维·后端·自动化运维
dk_tjy13 小时前
AI驱动的自动化攻击背景下:企业端点安全体系的技术架构与建设路径
网络·人工智能·安全·自动化·终端安全管理·数据防泄漏