drissionpage比selenium更轻量、少报错,适合绕反爬及dom高频操作;但非其升级替代,而是定位不同:selenium重多浏览器兼容与协议标准,drissionpage重chromium控制效率与pythonic封装。

DrissionPage 能比 Selenium 更轻量、更少报错地完成常规网页抓取,尤其适合需要绕过简单反爬、频繁操作 DOM 或依赖浏览器上下文的场景;但它不是 Selenium 的“升级替代”,而是定位不同——Selenium 重协议兼容性与多浏览器支持,DrissionPage 重本地 Chromium 控制效率与 Pythonic 封装。
DrissionPage 启动时如何避免被识别为自动化工具?
默认启动会暴露 webdriver 特征,常见表现为页面检测到 document.webdriver === true 或触发滑块/验证码。关键不是“隐藏”,而是让 DrissionPage 启动的 Chromium 行为接近真实用户:
- 必须传入
uc=True参数启用无头模式下的用户态模拟:Driver(uc=True) - 禁用自动化标志:在
Driver初始化时通过driver_options添加--disable-blink-features=AutomationControlled - 手动覆盖
navigator.webdriver:用driver.run_cdp('Page.addScriptToEvaluateOnNewDocument', source="Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") - 慎用无头模式(
headless=True):部分网站对--headless=new敏感,优先用headless=False+minimized=True模拟最小化窗口
用 ChromiumPage 替代 WebDriver 时 DOM 查找逻辑怎么改?
DrissionPage 的 ChromiumPage 对象不提供 find_element_by_* 这类已废弃的 Selenium 接口,也不直接返回 WebElement,而是统一用 ele() / elems() 方法,且查找语法更贴近 CSS 选择器和 XPath 的原生表达:
-
page.ele('#submit')等价于 Selenium 的find_element(By.CSS_SELECTOR, '#submit') -
page.ele('@class:btn')是 DrissionPage 特有的属性快捷写法,对应[class="btn"] - 获取文本不用
.text,而用.text(同名但行为更稳定)或.raw_text(跳过 JS 渲染干扰) - 点击前建议先
.wait.ele_displayed(),因为ele().click()默认不等待元素可见,容易报ElementNotInteractableError
处理 iframe 和新弹出标签页时为什么找不到元素?
DrissionPage 不自动切换上下文,iframe 和新 tab 需显式进入,否则所有 ele() 都在当前页面作用域执行,查不到嵌套内容:
- 进 iframe:
frame = page.get_frame('iframe[name="content"]'); frame.ele('button') - 等 iframe 加载完成:
page.wait.load_complete(); frame = page.get_frame(0)(按索引) - 监听新标签页并切换:
page.listen.start();page.get_new_handle();page.to_tab(page.latest_tab) - 注意:新标签页的
ChromiumTab对象不能直接调ele(),要先用tab.page获取对应页面对象
什么时候该坚持用 Selenium 而不是硬切 DrissionPage?
DrissionPage 依赖本地已安装的 Chromium(或自动下载),且只支持 Chrome/Edge 内核;若项目需 Firefox 兼容、远程 Grid 部署、或严格遵循 W3C WebDriver 协议(如某些云测试平台),Selenium 仍是唯一选择。另外,DrissionPage 对 WebRTC、MediaStream 类页面控制力较弱,音视频自动播放、摄像头权限弹窗等场景容易卡死或无法响应。
真正省事的地方在于:不需要配 driver path、不用管版本匹配、JS 执行返回值更直观、等待机制更贴近直觉。但一旦涉及跨域 iframe 注入、Service Worker 调试、或需要精确控制 DevTools 协议底层命令,就得退回到 run_cdp() 手动调用,这时和 Selenium 的 CDP 封装并无本质区别——只是封装层级不同而已。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











