人人都会AI编程

21.2 动态页面爬虫:Selenium、Playwright 浏览器自动化

更新时间:2026-07-12

很多现代网站用前端框架(React、Vue、Angular 等)渲染页面,真正的数据并不直接出现在 HTML 源码里,而是通过 JavaScript 异步加载到浏览器中。这时候用 requests 抓到的只是一个空壳,必须用浏览器自动化工具来模拟真实用户操作,等页面加载完毕后再提取渲染后的内容。Selenium 和 Playwright 是两大主流选择。

Selenium:老牌全能,生态成熟

Selenium 已经存在十几年,支持 Chrome、Firefox、Edge、Safari 等几乎所有浏览器,通过 WebDriver 协议控制真实浏览器。

基本用法

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 创建驱动(需提前下载对应浏览器驱动,或使用 webdriver-manager 自动管理)
driver = webdriver.Chrome()

driver.get("https://example.com")

# 显式等待某个元素出现
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".target-class"))
)

print(element.text)
driver.quit()

实用要点

  • 等待机制:绝对不要用 time.sleep() 盲目等待,要用显式等待(WebDriverWait)等特定元素加载。
  • 元素定位:支持多种策略(CSS 选择器、XPath、标签名等),优先用 CSS 选择器,更简洁。
  • 无头模式:添加 options.add_argument('--headless') 可让浏览器在后台运行,不弹出窗口。
  • 反爬对抗:很多网站会检测 Selenium 特征(如 navigator.webdriver)。可以通过注入 JS 隐藏特征,或使用 undetected-chromedriver 等封装库减小被拦截概率。

优点:支持浏览器最全,社区资源极丰富,几乎所有自动化需求都能找到解决方案。
缺点:性能较重,启动慢,并发能力有限;操作 API 略显陈旧,需要下载和管理驱动。

Playwright:新一代异步利器,体验更优

Playwright 是微软开发的现代框架,支持 Chromium、Firefox、WebKit(意味着能模拟 Safari),其最大亮点是自带浏览器二进制文件(一条命令下载),API 全部异步,执行速度快、稳定性高。

基本用法(同步版)

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)  # 无头模式
    page = browser.new_page()
    page.goto("https://example.com")

    # 自动等待元素可见
    element = page.locator(".target-class")
    print(element.text_content())

    browser.close()

实用要点

  • 自动等待page.locator() 执行操作(点击、获取文本)时会自动等待元素可交互,大大减少手动等待代码。
  • 网络拦截:可轻松拦截请求和响应,例如直接拿到 Ajax 返回的 JSON 数据而无需解析 DOM。
  • 多浏览器与多上下文:一个浏览器实例可创建多个独立的 BrowserContext,模拟不同用户、隔离 cookie/缓存,非常适合并发抓取。
  • 录制生成代码playwright codegen 命令可录制你的浏览器操作并生成 Python 脚本,逆向工程网页交互很方便。
  • 反爬对抗:Playwright 比 Selenium 更难以被网站检测,但仍可以配合 stealth 等插件进一步提升隐蔽性。

优点:API 现代化,内置等待,速度快,自带浏览器无需额外驱动,对单页应用支持极佳。
缺点:对老旧浏览器(如 IE 模式)支持有限;异步编程门槛略高于同步。

选型建议

  • 新项目优先选 Playwright:更少的代码、更高的稳定性,特别适合处理复杂的异步加载页面。
  • 旧项目、跨浏览器兼容性要求极高时选 Selenium:尤其在需要支持版本较老的 Firefox 或企业定制环境时。
  • 并发抓取:二者都可以配合多进程/协程并发,但 Playwright 的上下文隔离机制更省资源。

无论选哪个,核心原则都是:模拟用户,耐心等待,尽量减轻对目标网站的压力(设置合理的请求间隔,遵守 robots.txt),让爬虫在获取数据的同时保持可持续性。