news 2026/4/1 8:17:15

Python 爬虫实战:Selenium 模拟浏览器操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 爬虫实战:Selenium 模拟浏览器操作

前言

随着前端技术的发展,越来越多的网站采用动态渲染(如 JavaScript 异步加载、AJAX 请求)方式呈现内容,传统的 Requests 库仅能获取静态 HTML 源码,无法解析动态加载的数据。Selenium 作为一款自动化测试工具,能够模拟真实浏览器的操作行为,直接驱动浏览器渲染页面,完美解决动态页面爬取难题。本文将从 Selenium 核心原理出发,结合小红书首页实战场景,系统讲解模拟浏览器操作的核心技巧,帮助开发者攻克动态页面爬取的核心痛点。

摘要

本文聚焦 Selenium 模拟浏览器操作的核心技术,详细阐述 Selenium 的工作原理、环境搭建流程,以及模拟浏览器的核心操作(页面加载、元素定位、点击、输入、滚动等)。以小红书首页为实战对象,完整实现从浏览器启动、页面交互到动态数据提取的全流程,并补充反爬规避技巧(如浏览器指纹伪装、操作行为模拟)。最终实现的爬虫程序能够高度模拟人类浏览器操作,有效爬取动态渲染的网页内容,为复杂动态页面的爬取提供可落地的解决方案。

一、Selenium 核心原理剖析

1.1 Selenium 工作机制

Selenium 通过 WebDriver 与浏览器内核交互,实现对浏览器的自动化控制,核心架构如下:

组件作用
Selenium Client(Python 库)编写自动化脚本,发送操作指令(如点击、输入)
WebDriver(浏览器驱动)作为客户端与浏览器的中间层,解析指令并驱动浏览器执行
浏览器(Chrome/Firefox)执行 WebDriver 的指令,渲染页面并返回操作结果

Selenium 的核心优势在于:

  1. 完全模拟浏览器渲染流程,支持 JavaScript 动态加载;
  2. 可模拟人类所有浏览器操作(点击、滚动、输入、切换窗口等);
  3. 支持主流浏览器(Chrome、Firefox、Edge、Safari);
  4. 提供丰富的元素定位方式,适配复杂页面结构。

1.2 环境搭建

1.2.1 依赖安装

bash

运行

# 安装Selenium库 pip install selenium==4.15.0 # 安装浏览器驱动管理工具(自动匹配浏览器版本) pip install webdriver-manager
1.2.2 浏览器驱动配置

使用webdriver-manager可自动下载匹配当前浏览器版本的驱动,无需手动配置路径:

python

运行

# Chrome浏览器驱动配置示例 from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # 自动下载并配置Chrome驱动 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

二、核心浏览器操作实战

2.1 基础操作:页面加载与窗口控制

2.1.1 核心代码实现

python

运行

from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import time # 初始化Chrome浏览器(添加反爬配置) chrome_options = webdriver.ChromeOptions() # 禁用自动化特征检测 chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) # 禁用图片加载(提升爬取速度) chrome_options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) # 设置浏览器窗口大小 chrome_options.add_argument("--window-size=1920,1080") # 启动浏览器 driver = webdriver.Chrome( service=Service(ChromeDriverManager().install()), options=chrome_options ) try: # 1. 加载目标页面(小红书首页) target_url = "https://www.xiaohongshu.com/" driver.get(target_url) print(f"页面标题: {driver.title}") print(f"当前URL: {driver.current_url}") # 2. 窗口操作 # 获取当前窗口句柄 original_window = driver.current_window_handle print(f"原始窗口句柄: {original_window}") # 新建标签页 driver.execute_script("window.open('');") time.sleep(1) # 切换到新标签页 driver.switch_to.window(driver.window_handles[1]) # 在新标签页加载页面 driver.get("https://www.xiaohongshu.com/explore") print(f"新标签页标题: {driver.title}") # 3. 页面刷新 driver.refresh() print("页面已刷新") # 4. 窗口最大化 driver.maximize_window() # 停留5秒,观察操作效果 time.sleep(5) finally: # 关闭所有窗口并退出浏览器 driver.quit() print("浏览器已关闭")
2.1.2 输出结果

plaintext

页面标题: 小红书 - 标记我的生活 当前URL: https://www.xiaohongshu.com/ 原始窗口句柄: CDwindow-1234567890abcdef 新标签页标题: 小红书 - 发现 页面已刷新 浏览器已关闭
2.1.3 原理说明
  1. ChromeOptions配置核心反爬参数:
    • enable-automation:禁用自动化特征,避免被网站检测为 Selenium 爬虫;
    • 图片加载禁用:减少网络请求,提升页面加载速度;
    • 窗口大小设置:模拟真实用户的浏览器窗口尺寸;
  2. driver.get(url):驱动浏览器加载指定 URL,等待页面初步渲染完成;
  3. window.open():通过 JavaScript 新建标签页,模拟用户手动打开新标签页;
  4. switch_to.window():切换窗口句柄,实现多标签页操作;
  5. driver.quit():关闭所有窗口并释放资源(区别于driver.close()仅关闭当前窗口)。

2.2 核心操作:元素定位与交互

元素定位是 Selenium 操作的核心,支持 8 种定位方式,以下为最常用的定位与交互实战:

2.2.1 核心代码实现

python

运行

from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager import time # 初始化浏览器 chrome_options = webdriver.ChromeOptions() chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome( service=Service(ChromeDriverManager().install()), options=chrome_options ) try: # 加载小红书搜索页面 driver.get("https://www.xiaohongshu.com/search") # 隐式等待:全局等待元素加载(最多10秒) driver.implicitly_wait(10) # 1. 定位搜索框并输入内容 # 方式1:By.CSS_SELECTOR(推荐) search_box = driver.find_element(By.CSS_SELECTOR, "input[placeholder*='搜索']") # 清空输入框 search_box.clear() # 输入关键词 search_box.send_keys("Python爬虫实战") print("搜索框已输入关键词:Python爬虫实战") # 2. 模拟回车键搜索 search_box.send_keys(Keys.ENTER) time.sleep(2) # 3. 显式等待:等待搜索结果加载(最多15秒) result_list = WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.CLASS_NAME, "note-list")) ) print("搜索结果已加载") # 4. 定位并点击第一个搜索结果 first_note = driver.find_element(By.CSS_SELECTOR, ".note-item:first-child") first_note.click() print("已点击第一个搜索结果") time.sleep(3) # 5. 模拟页面滚动(向下滚动500像素) driver.execute_script("window.scrollBy(0, 500);") print("页面已向下滚动500像素") time.sleep(2) # 6. 获取元素文本内容 note_title = driver.find_element(By.TAG_NAME, "h1").text print(f"笔记标题:{note_title}") except Exception as e: print(f"操作异常:{str(e)}") finally: driver.quit() print("浏览器已退出")
2.2.2 输出结果

plaintext

搜索框已输入关键词:Python爬虫实战 搜索结果已加载 已点击第一个搜索结果 页面已向下滚动500像素 笔记标题:Python爬虫实战:从入门到精通(2025最新版) 浏览器已退出
2.2.3 原理说明
  1. 元素定位方式:
    • By.CSS_SELECTOR:通过 CSS 选择器定位(最灵活,推荐);
    • By.CLASS_NAME:通过类名定位;
    • By.TAG_NAME:通过标签名定位;其他常用方式:By.ID(ID 定位)、By.XPATH(XPath 路径定位);
  2. 元素交互方法:
    • clear():清空输入框;
    • send_keys():模拟键盘输入(支持Keys.ENTER等特殊按键);
    • click():模拟鼠标点击;
  3. 等待机制:
    • 隐式等待:implicitly_wait(10),全局设置,查找元素时最多等待 10 秒;
    • 显式等待:WebDriverWait,针对特定元素设置等待条件(如presence_of_element_located),更精准;
  4. 页面滚动:通过execute_script()执行 JavaScript 代码,模拟用户滚动行为。

2.3 高级操作:表单提交与文件上传

2.3.1 核心代码实现

python

运行

from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager import time # 初始化浏览器 chrome_options = webdriver.ChromeOptions() chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) driver = webdriver.Chrome( service=Service(ChromeDriverManager().install()), options=chrome_options ) try: # 加载测试表单页面(以开源测试站为例) driver.get("https://www.w3schools.com/html/html_forms.asp") driver.implicitly_wait(10) # 1. 定位表单输入框并填写 # 文本输入框 fname_input = driver.find_element(By.NAME, "fname") fname_input.send_keys("Python") lname_input = driver.find_element(By.NAME, "lname") lname_input.send_keys("Crawler") # 2. 定位单选按钮并点击 gender_male = driver.find_element(By.CSS_SELECTOR, "input[value='male']") # 滚动到元素可见 driver.execute_script("arguments[0].scrollIntoView();", gender_male) gender_male.click() print("已选择性别单选按钮") # 3. 定位下拉框并选择 # 需导入Select类 from selenium.webdriver.support.ui import Select country_select = Select(driver.find_element(By.NAME, "country")) # 方式1:按值选择 country_select.select_by_value("china") print("已选择国家:中国") # 4. 模拟文件上传 # 定位文件上传按钮 file_input = driver.find_element(By.NAME, "file") # 传入本地文件路径(需替换为实际路径) file_input.send_keys(r"C:\test\demo.txt") print("已选择上传文件") # 5. 提交表单 submit_btn = driver.find_element(By.CSS_SELECTOR, "input[type='submit']") # 模拟点击提交(注:测试站仅演示,无实际提交效果) submit_btn.click() print("表单已提交") time.sleep(3) except Exception as e: print(f"表单操作异常:{str(e)}") finally: driver.quit()
2.2.2 输出结果

plaintext

已选择性别单选按钮 已选择国家:中国 已选择上传文件 表单已提交
2.2.3 原理说明
  1. 单选按钮操作:需先滚动到元素可见(scrollIntoView()),避免元素在视口外无法点击;
  2. 下拉框操作:通过Select类封装下拉框元素,支持select_by_value()select_by_visible_text()select_by_index()三种选择方式;
  3. 文件上传:input[type='file']元素可直接通过send_keys()传入本地文件路径,无需模拟点击文件选择框;
  4. 表单提交:可通过点击提交按钮或调用form.submit()方法实现。

三、反爬规避高级技巧

3.1 浏览器指纹伪装

网站通过检测浏览器指纹(如navigator.webdriver、用户代理、插件列表)识别 Selenium,以下为核心伪装方案:

python

运行

from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager chrome_options = webdriver.ChromeOptions() # 1. 禁用webdriver特征 chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) # 2. 清除webdriver标识 chrome_options.add_argument("--disable-blink-features=AutomationControlled") # 3. 自定义User-Agent chrome_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. 禁用扩展程序 chrome_options.add_argument("--disable-extensions") # 5. 禁用插件 chrome_options.add_argument("--disable-plugins-discovery") # 6. 启用无痕模式(可选) # chrome_options.add_argument("--incognito") # 启动浏览器并执行JS清除指纹 driver = webdriver.Chrome( service=Service(ChromeDriverManager().install()), options=chrome_options ) # 执行JavaScript覆盖webdriver属性 driver.execute_script(""" Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); """) # 验证伪装效果 webdriver_status = driver.execute_script("return navigator.webdriver") print(f"navigator.webdriver值:{webdriver_status}") # 输出:undefined

3.2 人类行为模拟

通过随机延迟、不规则操作模拟真实用户行为,降低被识别风险:

python

运行

import random import time from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains # 初始化浏览器(省略配置) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) def human_like_click(element): """模拟人类点击(随机延迟+鼠标移动)""" # 随机延迟0.5-2秒 time.sleep(random.uniform(0.5, 2)) # 鼠标移动到元素(偏移随机像素) action = ActionChains(driver) offset_x = random.randint(-5, 5) offset_y = random.randint(-5, 5) action.move_to_element_with_offset(element, offset_x, offset_y).perform() # 随机延迟后点击 time.sleep(random.uniform(0.1, 0.5)) element.click() def human_like_scroll(): """模拟人类滚动(随机滚动距离+间隔)""" scroll_times = random.randint(3, 8) for _ in range(scroll_times): # 随机滚动距离 scroll_distance = random.randint(100, 500) driver.execute_script(f"window.scrollBy(0, {scroll_distance});") # 随机间隔 time.sleep(random.uniform(0.8, 2.5)) # 实战使用 driver.get("https://www.xiaohongshu.com/") search_box = driver.find_element(By.CSS_SELECTOR, "input[placeholder*='搜索']") # 人类式点击搜索框 human_like_click(search_box) # 人类式输入(逐字输入+随机间隔) keywords = "Python爬虫" for char in keywords: search_box.send_keys(char) time.sleep(random.uniform(0.1, 0.3)) # 人类式滚动 human_like_scroll()

四、常见问题与解决方案

问题现象原因分析解决方案
元素定位失败元素未加载完成 / 定位方式错误1. 增加显式等待;2. 更换定位方式(如 CSS→XPath);3. 检查元素是否在 iframe 内
被网站检测为爬虫浏览器指纹暴露 / 操作过于机械1. 伪装浏览器指纹;2. 增加随机延迟;3. 模拟人类行为(如随机滚动、鼠标偏移)
页面加载缓慢网络问题 / 图片 / 视频加载耗时1. 禁用图片 / 视频加载;2. 增加页面加载超时时间;3. 使用页面加载完成判断
点击元素无响应元素在视口外 / 被其他元素遮挡1. 滚动到元素可见;2. 使用 JavaScript 点击(driver.execute_script("arguments[0].click();", element)
多标签页切换失败窗口句柄获取错误1. 等待新标签页加载完成;2. 遍历窗口句柄匹配 URL / 标题

五、合规性与性能优化

5.1 合规性说明

  1. 遵守网站robots.txt协议(如小红书 Robots 协议);
  2. 控制爬取频率,避免给服务器造成压力;
  3. 仅爬取公开信息,不得获取用户隐私数据;
  4. 避免使用 Selenium 进行恶意操作(如批量注册、刷单)。

5.2 性能优化技巧

  1. 禁用不必要的加载:禁用图片、视频、CSS 加载,提升页面渲染速度;
  2. 使用无头模式:无需可视化界面,提升爬取效率(chrome_options.add_argument("--headless=new"));
  3. 复用浏览器实例:避免频繁启动 / 关闭浏览器,减少资源消耗;
  4. 异步操作:结合asyncio实现多浏览器实例异步爬取(需使用selenium-async扩展);
  5. 元素缓存:重复使用的元素提前定位并缓存,避免重复查找。

六、总结

Selenium 模拟浏览器操作是攻克动态页面爬取的核心技术,其核心价值在于完全复刻人类浏览器的操作流程,解决传统 Requests 库无法解析动态内容的问题。本文从环境搭建、基础操作、核心交互到高级反爬规避,构建了完整的 Selenium 实战体系,并结合小红书场景验证了技术的有效性。

在实际开发中,需结合前文的 UA 切换、限速延迟等技术,构建 “浏览器伪装 + 行为模拟 + 频率控制” 的综合反爬解决方案。后续系列文章将进一步讲解 Selenium 隐式 / 显式等待优化、切换标签页与窗口等高级技巧,敬请关注。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 9:19:43

39. UVM Factory Override

UVM Factory:验证平台的"智能生产线" 我们要学习UVM中最强大、最核心的特性之一:Factory机制。这就像是一个智能的生产线,可以根据需求动态更换生产的产品类型,而不需要修改生产线本身。 🎯 一句话理解UVM F…

作者头像 李华
网站建设 2026/3/25 15:06:30

毕设分享 基于单片机的红外热视仪(源码+硬件+论文)

文章目录 0 前言1 主要功能2 硬件设计3 核心软件设计4 实现效果5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己…

作者头像 李华
网站建设 2026/3/25 22:57:42

vue和springboot框架开发的基于协同过滤算法的跳蚤市场商品推荐系统_9k725cw1_一口蛋黄苏

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 同行可拿货,招校园代理 vuesprivue和springboot框架开发的基于协同过滤算法的跳蚤…

作者头像 李华