当网页内容通过 JavaScript 动态加载时,推荐使用 Selenium 控制真实浏览器执行渲染后再抓取。适用场景是反爬较弱且依赖浏览器环境的站点,风险边界在于性能开销大且容易被指纹识别。
先说结论:Selenium 通过驱动真实浏览器内核解决 JavaScript 渲染问题,但需权衡资源消耗与反爬检测。
- 适合:强依赖 JavaScript 渲染、无法通过 API 直接获取数据的页面。
- 先看:目标网站的反爬机制是否检测 WebDriver 特征。
- 建议:优先使用显式等待(Explicit Wait)替代固定休眠,减少抓取时间。
命令速用版
pip install selenium webdriver-manager为什么会这样
传统 HTTP 请求库只下载 HTML 源码,不执行 JavaScript 代码。Selenium 的核心价值在于自动化控制浏览器,让页面完成 DOM 构建和数据加载后再提取内容。
分步处理
第一步:初始化浏览器驱动。使用 webdriver-manager 自动管理驱动版本,避免手动下载 chromedriver。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))第二步:设置等待策略。必须等待目标元素出现,否则抓取到的内容为空。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver.get("https://example.com")
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "dynamic-content"))
)第三步:提取数据。使用 page_source 或直接获取元素文本。
data = element.text
# 或者
html = driver.page_source第四步:关闭浏览器。任务结束后必须调用 quit 释放资源。
driver.quit()怎么验证是否生效
打印获取到的元素文本长度或内容,确认非空且包含预期关键词。检查浏览器进程是否在脚本结束后完全关闭,避免僵尸进程占用内存。
常见坑
网站可能检测 navigator.webdriver 属性识别自动化脚本。部分站点会限制无头模式(Headless),建议先使用有头模式调试。频繁请求可能触发 IP 封禁,需控制请求频率。
常见问题
如何开启无头模式节省资源?
在 ChromeOptions 中添加 `--headless` 参数。注意部分网站检测到无头模式会拒绝服务,需配合其他指纹修改手段。
显式等待和隐式等待有什么区别?
显式等待针对特定条件暂停,隐式等待全局生效。推荐混用显式等待处理动态元素,避免隐式等待导致整体超时过长。
Selenium 抓取速度慢怎么办?
公开资料中没有看到可靠的量化数据对比,但通常比直接 HTTP 请求慢。可尝试禁用图片加载、使用无头模式或切换到 Playwright 等 newer 工具。
参考来源
Selenium Official Documentation - WebDriver Wait
URL: https://www.selenium.dev/documentation/webdriver/waits/