Selenium 爬虫反爬实战:Python 模拟浏览器点击动态页面采集

在 Python 爬虫开发中,我们经常会遇到动态渲染页面AJAX 异步加载按钮点击触发数据加载等场景。传统的 requests+BeautifulSoup 静态爬虫只能获取页面源码,无法执行 JavaScript,自然拿不到动态生成的数据。而 Selenium 作为主流的自动化测试工具,能完美模拟浏览器行为,成为破解动态页面、应对基础反爬机制的利器。

本文将从实战角度出发,讲解如何用 Selenium 模拟浏览器点击、滚动、输入等操作,高效采集动态页面数据,同时应对常见反爬策略,代码可直接运行,新手也能快速上手。

一、Selenium 爬虫核心优势与适用场景

为什么动态页面必须用 Selenium?先看核心优势:

  1. 完全模拟真实浏览器:支持 Chrome、Firefox 等,执行 JS、点击按钮、下拉加载、弹窗处理都没问题;
  2. 无需分析接口:不用抓包、逆向加密参数,所见即所得,降低开发成本;
  3. 应对基础反爬:能绕过 User-Agent 校验、Referer 限制、简单 Cookie 验证;
  4. 可视化调试:可开启浏览器窗口,直观看到每一步操作,方便排错。

适用场景:商品详情页点击加载、登录后数据获取、分页按钮点击、下拉刷新数据、弹窗拦截处理等。

二、环境搭建:Selenium + 浏览器驱动配置

1. 安装依赖库

打开命令行执行安装命令,建议使用国内镜像加速:

复制代码
pip install selenium==4.15.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

说明:选择稳定版 4.x,兼容最新浏览器驱动,避免版本不兼容报错。

2. 浏览器驱动配置(关键)

Selenium 需要对应浏览器的驱动才能控制浏览器,这里以Chrome 浏览器为例:

  1. 查看 Chrome 版本:浏览器右上角「三个点」→「帮助」→「关于 Google Chrome」;
  2. 下载对应版本驱动:ChromeDriver 官方地址
  3. 配置驱动:将下载的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 爬虫避坑指南

  1. 驱动版本不兼容:Chrome 版本必须和 ChromeDriver 对应,否则启动失败;
  2. 页面加载超时 :用WebDriverWait显式等待,别用固定time.sleep,提升效率;
  3. 被封 IP:频繁操作会封 IP,可搭配代理 IP,降低请求频率;
  4. 性能问题:Selenium 是浏览器渲染,速度比静态爬虫慢,适合小批量、动态数据采集;
  5. 元素定位失效 :动态页面 class、id 会变化,优先用CSS_SELECTORXPATH稳定定位。

六、总结

Selenium 是动态页面爬虫的神器,尤其适合无法分析接口、需要模拟点击操作的场景。本文从环境搭建、反爬配置、模拟点击实战、反爬破解四个维度,完整讲解了 Selenium 爬虫的实战流程,代码可直接修改选择器后使用。

核心要点:

  1. 配置浏览器选项,隐藏自动化特征,绕过基础反爬;
  2. 显式等待解决动态元素加载问题;
  3. 用 JS 点击解决按钮无法点击的坑;
  4. 模拟人工延时、滚动,降低被识别概率。

后续可结合 PyQuery、Pandas 做数据清洗、存储,打造完整的爬虫系统。如果本文对你有帮助,欢迎点赞、收藏、关注,后续会更新更高级的反爬实战教程!

相关推荐
程序员三藏21 小时前
自动化测试详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
szwyyx21 小时前
目前知名的BEL电源分销商哪家性价比高
人工智能·python
华如锦21 小时前
【AGENT开发】python学习 Python Level 5
python·学习·elasticsearch
忘路之远近i21 小时前
Selenium + 自研小型 Agent:用脚本加简易agent搭建简单数据工作流
人工智能·python
乐启国际旅行社有限公司1 天前
SpringSecurity+JWT实现文旅系统细粒度数据权限管控(多角色数据隔离)
开发语言·python
红莲凪是1 天前
使用二次封装的Excel COM 组件操作Excel\WPS ET IExcelRange 高级应用
python·excel·wps
AI人工智能集结号1 天前
AI回答采集数据清洗:Python实现空回答、拒绝与无关样本识别
开发语言·人工智能·python
kisloy1 天前
【爬虫入门第10讲】Scrapy 框架深度解析(一):五大组件与中间件
爬虫·scrapy·中间件
依晨照旧1 天前
uv 常用命令速查:一个工具干掉 pip + venv + pyenv + pipx + poetry,Python 工具链从此清爽
python
渣男教父1 天前
Python自动化操作 Word 和 PDF
后端·python