
本文介绍使用 seleniumbase 的 uc 模式绕过网站对标准 selenium 无头浏览器的检测,从而稳定抓取 chabad.org 等具备前端反自动化机制的目标页面。
本文介绍使用 seleniumbase 的 uc 模式绕过网站对标准 selenium 无头浏览器的检测,从而稳定抓取 chabad.org 等具备前端反自动化机制的目标页面。
许多现代网站(如 chabad.org)会主动检测并拦截标准 Selenium 无头浏览器访问——它们通过检查 navigator.webdriver、userAgent、缺失的 WebRTC 接口、Canvas 指纹或 Chrome 扩展环境等特征识别自动化流量。你遇到的 TimeoutException 并非页面加载慢,而是请求被服务器拒绝或前端 JS 阻塞渲染,导致目标元素(如 #group_4/15/2024)根本未注入 DOM。
直接启用 --headless=new 无法解决该问题,因为其仍暴露明显的自动化指纹。更可靠的方案是采用 SeleniumBase 的 UC(Undetected Chromedriver)模式:它自动打补丁、伪装真实用户行为、隐藏 WebDriver 属性、模拟人类操作延迟,并兼容无头运行。
✅ 正确做法如下:
-
安装依赖
立即学习“Python免费学习笔记(深入)”;
pip install seleniumbase
-
编写健壮的无头抓取脚本
import re from seleniumbase import SB
with SB(uc=True, headless=True, timeout=30) as sb:
访问目标页面(UC 模式自动绕过 bot 检测)
sb.open('https://www.chabad.org/calendar/zmanim_cdo/aid/143790/locationid/790/locationtype/1/save/1/tdate/4-15-2024/jewish/Zmanim-Halachic-Times.htm')
# 模拟真实用户交互:点击日期选择器按钮 → 切换月份 → 选择具体日期
sb.click("button#button1") # 触发日历弹窗
sb.click("span#month") # 打开月份选择
sb.click('div[value="12"]') # 选择 12 月(示例)
sb.click('[date*="12/31"]') # 选择 12 月 31 日
# 等待并提取目标内容(自动隐式等待 + 显式容错)
text = sb.get_text_content("div.group.active_date")
# 清理多余换行符,提升可读性
text = re.sub(r'\n+', '\n', text).strip()
print(text)? **关键优势说明**: - `uc=True` 启用 Undetected Chromedriver 补丁,彻底隐藏 `window.navigator.webdriver === true` 等指纹; - `headless=True` 保持服务端零图形界面运行,节省资源; - `SB` 自动处理页面加载等待、元素可见性校验和异常重试,无需手动写 `WebDriverWait`; - 支持链式操作(如 `sb.click().type().get_text_content()`),代码简洁且语义清晰。 ⚠️ **注意事项**: - 不要混用原生 `selenium.webdriver` 与 `seleniumbase.SB` —— 二者驱动实例不兼容; - 若需自定义 Chrome 选项(如代理、证书),可通过 `sb.driver` 获取底层 WebDriver 实例后配置,但建议优先使用 `SB(..., **kwargs)` 参数(如 `proxy`, `ad_block`, `disable_js`); - 目标页面存在动态 JS 渲染逻辑(如点击后才加载数据),因此必须模拟真实点击流,而非仅 `driver.get()` 后直接查找元素; - 生产环境建议添加 `--no-sandbox` 和 `--disable-dev-shm-usage`(SeleniumBase 默认已适配 Docker/Linux 无沙盒环境)。 通过该方案,你可在服务器上稳定、静默、高成功率地批量获取 Halachic Times 等结构化时间数据,完全规避传统 Selenium 在无头模式下的反爬失效问题。


















