selenium 4是执行js渲染页面的首选工具,因其废弃desiredcapabilities、支持相对路径service、原生自动下载驱动、强制显式等待、统一find_element方法、强化无头模式反检测及精准渲染判断。

直接用 requests 拿不到 JavaScript 渲染后的内容,不是代码写错了,是它本来就不干这事。必须换能执行 JS 的工具,Selenium 4 是目前最稳、文档最全、兼容性最好的选择之一。
为什么 Selenium 4 要比旧版更值得用
Selenium 4 废弃了 DesiredCapabilities,改用 Options 统一管理启动参数;原生支持相对路径的 Service 初始化,不用硬编码 chromedriver 位置;WebDriverManager 已基本被弃用,推荐用 webdriver-manager(注意包名不同)或直接让 Selenium 自动下载驱动。
-
webdriver.Chrome(service=Service(), options=options)是唯一推荐的初始化方式 - 显式等待(
WebDriverWait+expected_conditions)必须替代time.sleep(),否则容易因网络抖动漏数据 - 不再支持
find_element_by_*()系列方法,全部统一为find_element(By.ID, "xxx")
如何正确配置无头模式与反检测
很多网站会检测 headless 标志并拒绝响应,光加 --headless 不够,得补全指纹特征:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 必须设置
--no-sandbox和--disable-dev-shm-usage,否则容器环境常崩 - 加上
--disable-blink-features=AutomationControlled隐藏自动化痕迹 - 手动覆盖
navigator.webdriver:用driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {...}) - User-Agent 建议从真实浏览器中复制,不要用默认值
等待 JS 渲染完成的关键判断点
不能只等某个元素“出现”,要等它“有内容”或“脱离 loading 状态”。常见误判场景:
-
presence_of_element_located只确认 DOM 存在,但里面可能是空的或占位符 -
visibility_of_element_located更好,但仍有 CSSdisplay: none的干扰 - 最佳实践是组合判断:先等容器存在,再用
driver.execute_script("return document.querySelector(...).innerText")检查文本非空 - 如果页面用 React/Vue,可监听
window.__REACT_DEVTOOLS_GLOBAL_HOOK__或window.Vue是否就绪
代理与登录态复用的实际坑点
带认证的 HTTP 代理在 Selenium 4 中不能靠 --proxy-server + --proxy-auth 实现(Chromium 已废弃该方式),必须走扩展或 CDP:
- 推荐用
mitmproxy做中间代理,Selenium 访问本地 mitm 地址,由它转发并注入认证头 - 登录态保存/恢复要用
driver.get_cookies()+driver.add_cookie(),注意expiry字段要转成 int 秒级时间戳 - Cookie 必须在访问目标域名**之后**再添加,否则会被浏览器忽略
- 如果页面依赖 localStorage,也要同步导出
driver.execute_script("return JSON.stringify(localStorage)")
真正难的不是启动浏览器,而是判断“什么时候算加载完了”——JS 渲染没有标准完成信号,得结合网络请求状态、DOM 变化、控制台日志甚至自定义全局变量来交叉验证。别信“等 5 秒就够了”这种说法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










