在 Python 爬虫开发中,我们经常会遇到动态渲染页面 、AJAX 异步加载 、按钮点击触发数据加载等场景。传统的 requests+BeautifulSoup 静态爬虫只能获取页面源码,无法执行 JavaScript,自然拿不到动态生成的数据。而 Selenium 作为主流的自动化测试工具,能完美模拟浏览器行为,成为破解动态页面、应对基础反爬机制的利器。
本文将从实战角度出发,讲解如何用 Selenium 模拟浏览器点击、滚动、输入等操作,高效采集动态页面数据,同时应对常见反爬策略,代码可直接运行,新手也能快速上手。
一、Selenium 爬虫核心优势与适用场景
为什么动态页面必须用 Selenium?先看核心优势:
- 完全模拟真实浏览器:支持 Chrome、Firefox 等,执行 JS、点击按钮、下拉加载、弹窗处理都没问题;
- 无需分析接口:不用抓包、逆向加密参数,所见即所得,降低开发成本;
- 应对基础反爬:能绕过 User-Agent 校验、Referer 限制、简单 Cookie 验证;
- 可视化调试:可开启浏览器窗口,直观看到每一步操作,方便排错。
适用场景:商品详情页点击加载、登录后数据获取、分页按钮点击、下拉刷新数据、弹窗拦截处理等。

二、环境搭建:Selenium + 浏览器驱动配置
1. 安装依赖库
打开命令行执行安装命令,建议使用国内镜像加速:
pip install selenium==4.15.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
说明:选择稳定版 4.x,兼容最新浏览器驱动,避免版本不兼容报错。
2. 浏览器驱动配置(关键)
Selenium 需要对应浏览器的驱动才能控制浏览器,这里以Chrome 浏览器为例:
- 查看 Chrome 版本:浏览器右上角「三个点」→「帮助」→「关于 Google Chrome」;
- 下载对应版本驱动:ChromeDriver 官方地址;
- 配置驱动:将下载的
chromedriver.exe放到 Python 根目录,或代码中指定路径。
新版 Selenium 4.x 简化配置,无需手动指定路径,自动匹配驱动,代码更简洁。
三、实战核心:模拟浏览器点击 + 动态数据采集
我们以模拟点击分页、获取动态加载的列表数据为例,完整演示爬虫流程,包含反爬优化、元素定位、点击操作、数据解析。
实战目标
爬取动态渲染的列表页,通过点击下一页按钮,循环采集多页数据,应对:按钮延迟加载、元素不可见、页面加载慢等反爬问题。
完整实战代码
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
import time
import random
# -------------------------- 反爬优化配置 --------------------------
options = webdriver.ChromeOptions()
# 1. 隐藏自动化特征(绕过浏览器检测)
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
# 2. 禁用图片加载(提速,减少被识别)
options.add_argument("blink-settings=imagesEnabled=false")
# 3. 模拟真实浏览器UA
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')
# 4. 无头模式(后台运行,不弹出浏览器,生产环境开启)
# options.add_argument('--headless=new')
# 初始化浏览器驱动
driver = webdriver.Chrome(options=options)
# 设置窗口大小,模拟真实操作
driver.set_window_size(1920, 1080)
# 目标动态页面(替换为你要爬取的网址)
target_url = "https://www.example.com/dynamic-list"
driver.get(target_url)
# 等待页面加载,随机延时更像人工操作
time.sleep(random.uniform(1.5, 3))
# -------------------------- 核心功能:模拟点击+数据采集 --------------------------
def get_page_data():
"""采集当前页面动态数据"""
data_list = []
try:
# 显式等待:等待数据元素加载完成(最长10秒)
WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CLASS_NAME, "list-item"))
)
# 获取所有列表项(动态渲染的元素)
items = driver.find_elements(By.CLASS_NAME, "list-item")
for item in items:
# 提取标题、链接、时间(根据实际页面修改选择器)
title = item.find_element(By.CSS_SELECTOR, ".title").text.strip()
link = item.find_element(By.TAG_NAME, "a").get_attribute("href")
time_str = item.find_element(By.CLASS_NAME, "time").text.strip()
data_list.append({
"标题": title,
"链接": link,
"发布时间": time_str
})
except Exception as e:
print(f"数据采集失败:{str(e)}")
return data_list
# 循环点击下一页,采集3页数据
all_data = []
for page in range(1, 4):
print(f"正在采集第{page}页数据...")
# 采集当前页
page_data = get_page_data()
all_data.extend(page_data)
print(f"第{page}页采集到{len(page_data)}条数据")
# 模拟人工延时,防止点击过快触发反爬
time.sleep(random.uniform(2, 4))
# 点击「下一页」按钮(关键:模拟浏览器点击)
try:
# 等待按钮可点击,再执行点击
next_btn = WebDriverWait(driver, 8).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, ".next-page"))
)
# 模拟鼠标点击
driver.execute_script("arguments[0].click();", next_btn)
# 等待新页面加载
time.sleep(random.uniform(1, 2.5))
except Exception as e:
print("已到最后一页,停止采集")
break
# 关闭浏览器
driver.quit()
# 打印结果
print("="*50)
print(f"总共采集到{len(all_data)}条数据")
for i, data in enumerate(all_data[:5], 1):
print(f"{i}. {data['标题']} | {data['发布时间']}")
四、反爬实战:绕过动态页面常见限制
很多网站会针对 Selenium 做反爬检测,以下是实战有效的破解方案,直接加到代码里就能用:
1. 隐藏 Selenium 自动化特征
网站会通过window.navigator.webdriver检测是否为自动化工具,上面代码中已配置:
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
同时执行 JS 清除特征:
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
2. 模拟人工操作行为
-
随机延时 :不用
time.sleep(2)固定延时,用random.uniform(1,3)模拟人工停顿; -
模拟滚动 :数据下拉加载时,模拟滚动页面:
# 模拟缓慢滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(random.uniform(1, 2)) -
避免高频请求:每页采集完停顿 2-4 秒,不要连续快速点击。
3. 处理元素无法点击问题
动态页面常出现元素被遮挡、未加载完成的情况,不用原生 click (),改用 JS 点击:
# 解决:元素不可点击、被遮挡问题
driver.execute_script("arguments[0].click();", next_btn)
五、Selenium 爬虫避坑指南
- 驱动版本不兼容:Chrome 版本必须和 ChromeDriver 对应,否则启动失败;
- 页面加载超时 :用
WebDriverWait显式等待,别用固定time.sleep,提升效率; - 被封 IP:频繁操作会封 IP,可搭配代理 IP,降低请求频率;
- 性能问题:Selenium 是浏览器渲染,速度比静态爬虫慢,适合小批量、动态数据采集;
- 元素定位失效 :动态页面 class、id 会变化,优先用
CSS_SELECTOR、XPATH稳定定位。
六、总结
Selenium 是动态页面爬虫的神器,尤其适合无法分析接口、需要模拟点击操作的场景。本文从环境搭建、反爬配置、模拟点击实战、反爬破解四个维度,完整讲解了 Selenium 爬虫的实战流程,代码可直接修改选择器后使用。
核心要点:
- 配置浏览器选项,隐藏自动化特征,绕过基础反爬;
- 用显式等待解决动态元素加载问题;
- 用 JS 点击解决按钮无法点击的坑;
- 模拟人工延时、滚动,降低被识别概率。
后续可结合 PyQuery、Pandas 做数据清洗、存储,打造完整的爬虫系统。如果本文对你有帮助,欢迎点赞、收藏、关注,后续会更新更高级的反爬实战教程!