现代 Selenium 爬虫教程 (2024)

你是不是曾经遇到过抓静态页面用 requests 快得飞起,但一碰到下拉加载、滑块登录、多层 iframe、实时 DOM 更新这种动态渲染+交互场景就抓瞎?今天这篇全是 Selenium 4.x 新 API、2024 反检测/性能优化干货的教程,帮你一站式搞定这些棘手问题~

1. 核心价值(为什么还选 Selenium 4?)

虽然 Playwright、Puppeteer 这些后起之秀势头猛,但 Selenium 至今仍是处理复杂 Web 兼容性、遗留系统自动化、跨浏览器验证爬虫的首选工具,核心优势在于:

  • ✅ 生态最成熟:支持所有主流浏览器、编程语言
  • ✅ 社区资源丰富:反检测、Grid 分布式等方案遍地开花
  • ✅ 4.x 迭代给力:API 更规范、内置 CDP(Chrome DevTools Protocol)支持、无头模式更稳定

2. 极简环境搭建

不用再手动下载和浏览器版本匹配的驱动了!Python 社区的 webdriver-manager 已经完美解决这个痛点👇

2.1 安装依赖包

# 固定 4.15.0 版本(兼容性最好的稳定版本之一)
pip install selenium==4.15.0 webdriver-manager tenacity

2.2 (可选)安装浏览器

Windows/macOS 直接去 Chrome/Edge 官网下载;Linux 用 apt/yum 即可(这里用 Chrome 举例):

# Debian/Ubuntu 安装 Chrome
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
sudo apt-get install -f  # 修复依赖

3. 基础操作:4.x 专属规范

Selenium 4 废弃了大量旧的 API(比如 find_element_by_id),请务必改用统一的 By 类定位,代码更规范、兼容性更强👇

3.1 一键初始化浏览器

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# ✅ 现代初始化(自动匹配驱动版本)
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")  # 窗口最大化
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)

# 访问百度并测试
try:
    driver.get("https://www.baidu.com")
    print(f"页面标题:{driver.title}")  # 输出「百度一下,你就知道」
finally:
    driver.quit()  # 无论是否报错都要关闭浏览器,避免残留进程

3.2 常用元素定位与交互

from selenium.webdriver.common.by import By

# 推荐定位优先级:ID > NAME > CSS_SELECTOR > XPATH
search_box = driver.find_element(By.ID, "kw")
search_btn = driver.find_element(By.CSS_SELECTOR, "#su")

# 基础交互
search_box.send_keys("Selenium 4 爬虫")  # 输入内容
search_box.clear()  # 清空输入框
search_box.send_keys("Python 爬虫")  # 重新输入
search_btn.click()  # 点击按钮

4. 高级特性:搞定复杂场景

4.1 显式等待:再也不用 time.sleep() 凑时间

显式等待只针对特定元素的特定状态,比硬睡高效、稳定得多(2024 反爬虫大忌就是规律的硬睡!)👇

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待「Python 官网」搜索结果第一条可点击,最多等10秒
try:
    first_result = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "#content_left h3 a"))
    )
    first_result.click()
finally:
    driver.quit()

4.2 处理 iframe 和多窗口

iframe 嵌套、点击跳转新窗口是爬虫常见的坑,Selenium 4 提供了简洁的切换方法👇

# 1️⃣ 切换到 iframe(有三种方法:ID/NAME、WebElement、索引)
iframe = driver.find_element(By.ID, "login-frame")
driver.switch_to.frame(iframe)
# 在 iframe 里操作
driver.find_element(By.NAME, "username").send_keys("test")
# 返回主页面(必须!)
driver.switch_to.default_content()

# 2️⃣ 切换到新窗口
main_window = driver.current_window_handle  # 保存当前主窗口句柄
# 点击跳转新窗口的按钮
driver.find_element(By.LINK_TEXT, "新标签页链接").click()
# 遍历所有窗口句柄,切换到新的
for handle in driver.window_handles:
    if handle != main_window:
        driver.switch_to.window(handle)
        break
# 操作完新窗口后可以选择关闭或返回
driver.close()  # 关闭当前新窗口
driver.switch_to.window(main_window)  # 返回主窗口

4.3 反检测技术:2024 年最新避坑指南

反爬虫最常用的手段就是检测浏览器自动化特征,Selenium 4 配合 CDP 可以完美伪装成普通用户👇

options = webdriver.ChromeOptions()

# 1️⃣ 隐藏自动化标签和特征
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)

# 2️⃣ 伪装成真实用户(随机 UA 可以用 fake_useragent 库)
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36")

# 3️⃣ 初始化后再注入 CDP 脚本(隐藏 navigator.webdriver)
driver = webdriver.Chrome(service=service, options=options)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
    Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
    });
    Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5]
    });
    """
})

5. 性能优化:爬虫跑起来更稳更快

5.1 现代无头模式(Chrome 112+)

旧版 --headless 无头模式的 DOM 渲染和正常浏览器有差异,2023 年推出的 --headless=new 完美解决这个问题,速度和稳定性都有提升👇

options.add_argument("--headless=new")  # 必须写在 options 初始化后!
options.add_argument("--window-size=1920,1080")  # 无头模式必须设置窗口大小,否则元素可能定位不到
options.add_argument("--blink-settings=imagesEnabled=false")  # 禁用图片加载(大幅节省带宽)
options.add_argument("--disable-dev-shm-usage")  # 解决 Docker 或 Linux 容器下的内存不足问题
options.add_argument("--no-sandbox")  # 同上

5.2 混合 Requests+Selenium:兼顾速度和动态渲染

有些网站只有登录/获取 Cookie 需要动态交互,后续 API 请求直接用 requests 更快。这种混合方案是 2024 年爬虫的最佳实践之一👇

import requests
from selenium import webdriver
from selenium.webdriver.common.by import By

# 1️⃣ 用 Selenium 登录获取 Cookie
driver = webdriver.Chrome(service=service, options=options)
try:
    driver.get("https://需要登录的网站.com")
    # (省略登录操作:输入账号密码、点击登录、等待跳转)
    # 获取 Cookie 并转换成 Requests 能用的字典
    cookies = {c["name"]: c["value"] for c in driver.get_cookies()}
finally:
    driver.quit()

# 2️⃣ 用 Requests 携带 Cookie 爬取后续数据
session = requests.Session()
session.cookies.update(cookies)
response = session.get("https://需要登录的网站.com/api/data")
print(response.json())

6. 总结:2024 年 Selenium 爬虫的正确打开方式

  1. API 规范:全用 Selenium 4.x 的 By 类定位、CDP 命令
  2. 反检测优先:隐藏自动化特征、随机 UA、避免规律硬睡
  3. 性能优化:现代无头模式、禁用非必要资源、混合 Requests
  4. 健壮性保障:显式等待代替硬睡、用 tenacity 库加重试机制
  5. 合理选择工具:如果是纯现代网站、不需要跨浏览器,Playwright 也是不错的选择~

通过这篇教程,你应该能快速上手搭建一个高效、稳定、反检测能力强的 Selenium 爬虫了!如果还有问题,欢迎在评论区留言讨论~