历史第一人乔帮主 發表於 2026-1-9 09:29:04

从入门到精通解析Python Selenium如何模拟浏览器操作

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、Selenium入门准备:环境搭建与核心原理</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1. 核心原理</a></li><li><a href="#_lab2_0_1">2. 环境安装</a></li><li><a href="#_lab2_0_2">3. 验证环境</a></li></ul><li><a href="#_label1">二、Selenium基础操作:浏览器与页面控制</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_3">1. 浏览器核心操作</a></li><li><a href="#_lab2_1_4">2. 等待机制:解决元素加载延迟问题</a></li></ul><li><a href="#_label2">三、核心技能:元素定位(爬取/操作的关键)</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_5">1. 8种定位方式(按优先级排序)</a></li><li><a href="#_lab2_2_6">2. 实战:XPath/CSS选择器高级用法</a></li><li><a href="#_lab2_2_7">3. 批量定位元素</a></li></ul><li><a href="#_label3">四、模拟用户操作:输入、点击、滚动等</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_8">1. 输入与清空</a></li><li><a href="#_lab2_3_9">2. 点击操作</a></li><li><a href="#_lab2_3_10">3. 滚动页面</a></li><li><a href="#_lab2_3_11">4. 处理弹窗</a></li><li><a href="#_lab2_3_12">5. 处理下拉框</a></li></ul><li><a href="#_label4">五、进阶技巧:反爬规避与效率优化</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_13">1. 配置无界面模式(后台运行)</a></li><li><a href="#_lab2_4_14">2. 规避浏览器指纹检测</a></li><li><a href="#_lab2_4_15">3. 多标签页/窗口操作</a></li><li><a href="#_lab2_4_16">4. 截图与日志</a></li></ul><li><a href="#_label5">六、实战案例:爬取JS动态加载的商品数据</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">七、常见问题与避坑指南</a></li><ul class="second_class_ul"></ul></ul></div><p>Selenium是一款开源的自动化测试工具,核心优势在于能模拟真实用户操作浏览器(如点击、输入、滚动),并渲染动态加载的网页内容(解决Requests库无法爬取JS动态数据的问题)。</p>
<p class="maodian"><a name="_label0"></a></p><h2>一、Selenium入门准备:环境搭建与核心原理</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1. 核心原理</h3>
<p>Selenium通过&ldquo;浏览器驱动(Driver)&rdquo;与浏览器通信:Python代码发送操作指令&rarr;Driver解析指令&rarr;浏览器执行操作并返回渲染后的页面数据,完美适配JS动态渲染的网页(如Ajax加载、Vue/React前端页面)。</p>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2. 环境安装</h3>
<p>(1)安装Selenium库</p>
<div class="jb51code"><pre class="brush:bash;"># 安装最新版Selenium
pip install selenium
</pre></div>
<p><strong>关键步骤</strong>:</p>
<p>查看浏览器版本(如Chrome:设置&rarr;关于Chrome,查看版本号);</p>
<p>下载对应版本的驱动(版本号需完全匹配,如Chrome 120.x对应ChromeDriver 120.x);</p>
<p>配置驱动路径:</p>
<ul><li>方法1:将驱动文件放入Python安装目录(如Python39/Scripts),无需手动指定路径;</li><li>方法2:手动指定驱动路径(推荐,避免版本冲突)。</li></ul>
<p class="maodian"><a name="_lab2_0_2"></a></p><h3>3. 验证环境</h3>
<div class="jb51code"><pre class="brush:py;"># 导入Selenium核心模块
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# 手动指定ChromeDriver路径
driver_path = "C:/chromedriver.exe"# Windows路径示例
# 初始化浏览器对象
driver = webdriver.Chrome(service=Service(driver_path))
# 打开测试网页
driver.get("https://www.baidu.com")
# 打印网页标题(输出“百度一下,你就知道”则环境正常)
print(driver.title)
# 关闭浏览器
driver.quit()
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>二、Selenium基础操作:浏览器与页面控制</h2>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>1. 浏览器核心操作</h3>
<table><thead><tr><th>操作</th><th>代码示例</th><th>说明</th></tr></thead><tbody><tr><td>打开网页</td><td>driver.get(&quot;https://www.xxx.com&quot;)</td><td>加载目标URL</td></tr><tr><td>刷新页面</td><td>driver.refresh()</td><td>模拟浏览器刷新</td></tr><tr><td>前进/后退</td><td>driver.forward() / driver.back()</td><td>模拟浏览器前进/后退按钮</td></tr><tr><td>窗口最大化</td><td>driver.maximize_window()</td><td>避免元素因窗口过小无法定位</td></tr><tr><td>设置窗口大小</td><td>driver.set_window_size(1920, 1080)</td><td>自定义窗口分辨率</td></tr><tr><td>获取当前URL</td><td>driver.current_url</td><td>查看当前页面URL(验证跳转是否成功)</td></tr><tr><td>获取页面源码</td><td>driver.page_source</td><td>获取渲染后的完整HTML源码(含JS动态内容)</td></tr></tbody></table>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>2. 等待机制:解决元素加载延迟问题</h3>
<p>网页动态加载时,直接定位元素会因&ldquo;元素未加载完成&rdquo;报错,Selenium提供3种等待方式:</p>
<p>(1)强制等待(不推荐)</p>
<div class="jb51code"><pre class="brush:py;">import time
# 强制等待3秒(无论元素是否加载完成)
time.sleep(3)
</pre></div>
<p>(2)隐式等待(全局生效)</p>
<div class="jb51code"><pre class="brush:py;"># 设置隐式等待:最长等待10秒,元素加载完成则立即执行
driver.implicitly_wait(10)
</pre></div>
<p>(3)显式等待(推荐,精准控制)</p>
<p>针对指定元素设置等待条件(如元素可点击、可见),超时则抛出异常:</p>
<div class="jb51code"><pre class="brush:py;">from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 等待“百度搜索框”可见,最长等待10秒
wait = WebDriverWait(driver, 10)
search_box = wait.until(
    EC.visibility_of_element_located((By.ID, "kw"))
)
</pre></div>
<p><strong>常用等待条件</strong>:</p>
<ul><li><code>EC.visibility_of_element_located</code>:元素可见;</li><li><code>EC.element_to_be_clickable</code>:元素可点击;</li><li><code>EC.presence_of_element_located</code>:元素存在于DOM中;</li><li><code>EC.text_to_be_present_in_element</code>:元素包含指定文本。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>三、核心技能:元素定位(爬取/操作的关键)</h2>
<p>元素定位是Selenium的核心,需根据网页结构选择最优定位方式,优先选择唯一标识(ID、Name),其次选择XPath/CSS选择器。</p>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>1. 8种定位方式(按优先级排序)</h3>
<table><thead><tr><th>定位方式</th><th>代码示例</th><th>适用场景</th></tr></thead><tbody><tr><td>ID定位</td><td>driver.find_element(By.ID, &quot;kw&quot;)</td><td>元素有唯一ID(如百度搜索框id=&ldquo;kw&rdquo;)</td></tr><tr><td>Name定位</td><td>driver.find_element(By.NAME, &quot;wd&quot;)</td><td>元素有唯一Name属性</td></tr><tr><td>Class定位</td><td>driver.find_element(By.CLASS_NAME, &quot;s_ipt&quot;)</td><td>元素Class属性唯一</td></tr><tr><td>Tag定位</td><td>driver.find_element(By.TAG_NAME, &quot;input&quot;)</td><td>标签唯一(如页面唯一的input框)</td></tr><tr><td>Link文本定位</td><td>driver.find_element(By.LINK_TEXT, &quot;新闻&quot;)</td><td>精准匹配超链接文本</td></tr><tr><td>部分Link文本</td><td>driver.find_element(By.PARTIAL_LINK_TEXT, &quot;新&quot;)</td><td>模糊匹配超链接文本</td></tr><tr><td>XPath定位</td><td>driver.find_element(By.XPATH, &#39;//*[@id=&quot;kw&quot;]&#39;)</td><td>无唯一属性时,万能定位方式</td></tr><tr><td>CSS选择器</td><td>driver.find_element(By.CSS_SELECTOR, &quot;#kw&quot;)</td><td>定位效率高于XPath,推荐使用</td></tr></tbody></table>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>2. 实战:XPath/CSS选择器高级用法</h3>
<p>(1)XPath定位(万能且灵活)</p>
<div class="jb51code"><pre class="brush:py;"># 绝对路径(不推荐,页面结构变化易失效)
driver.find_element(By.XPATH, "/html/body/div/div/input")
# 相对路径+属性(推荐)
driver.find_element(By.XPATH, '//input[@id="kw"]')
# 包含文本的元素
driver.find_element(By.XPATH, '//a')
# 父节点定位子节点
driver.find_element(By.XPATH, '//div[@class="s_form"]/input')
</pre></div>
<p>(2)CSS选择器(效率更高)</p>
<div class="jb51code"><pre class="brush:py;"># ID选择器
driver.find_element(By.CSS_SELECTOR, "#kw")
# Class选择器
driver.find_element(By.CSS_SELECTOR, ".s_ipt")
# 属性选择器
driver.find_element(By.CSS_SELECTOR, 'input')
# 层级选择器
driver.find_element(By.CSS_SELECTOR, "div.s_form &gt; input")
</pre></div>
<p class="maodian"><a name="_lab2_2_7"></a></p><h3>3. 批量定位元素</h3>
<p>使用<code>find_elements()</code>(复数形式)获取多个元素,返回列表:</p>
<div class="jb51code"><pre class="brush:py;"># 获取页面所有超链接
links = driver.find_elements(By.TAG_NAME, "a")
for link in links:
    print(link.get_attribute("href"))# 打印链接地址
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>四、模拟用户操作:输入、点击、滚动等</h2>
<p class="maodian"><a name="_lab2_3_8"></a></p><h3>1. 输入与清空</h3>
<div class="jb51code"><pre class="brush:py;"># 定位搜索框并输入内容
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("Selenium教程")# 输入文本
search_box.clear()# 清空输入框
search_box.send_keys("Python爬虫")# 重新输入
</pre></div>
<p class="maodian"><a name="_lab2_3_9"></a></p><h3>2. 点击操作</h3>
<div class="jb51code"><pre class="brush:py;"># 点击搜索按钮
search_btn = driver.find_element(By.ID, "su")
search_btn.click()

# 模拟回车键(替代点击按钮)
search_box.send_keys(Keys.ENTER)
</pre></div>
<p class="maodian"><a name="_lab2_3_10"></a></p><h3>3. 滚动页面</h3>
<div class="jb51code"><pre class="brush:py;">from selenium.webdriver.common.keys import Keys

# 方式1:模拟键盘向下滚动(PageDown)
driver.find_element(By.TAG_NAME, "body").send_keys(Keys.PAGE_DOWN)

# 方式2:JS脚本滚动(精准控制)
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 滚动到指定元素位置
target = driver.find_element(By.ID, "target_id")
driver.execute_script("arguments.scrollIntoView();", target)
</pre></div>
<p class="maodian"><a name="_lab2_3_11"></a></p><h3>4. 处理弹窗</h3>
<p>(1)alert弹窗(系统弹窗)</p>
<div class="jb51code"><pre class="brush:py;"># 等待弹窗出现
alert = WebDriverWait(driver, 10).until(EC.alert_is_present())
# 获取弹窗文本
print(alert.text)
# 确认弹窗
alert.accept()
# 取消弹窗(仅confirm弹窗可用)
# alert.dismiss()
</pre></div>
<p>(2)iframe框架(嵌套页面)</p>
<p>需先切换到iframe,才能定位内部元素:</p>
<div class="jb51code"><pre class="brush:py;"># 方式1:通过ID切换
driver.switch_to.frame("iframe_id")
# 方式2:通过元素定位切换
iframe = driver.find_element(By.XPATH, '//iframe[@name="iframe_name"]')
driver.switch_to.frame(iframe)

# 操作iframe内元素
driver.find_element(By.ID, "inner_btn").click()

# 切回主页面
driver.switch_to.default_content()
</pre></div>
<p class="maodian"><a name="_lab2_3_12"></a></p><h3>5. 处理下拉框</h3>
<div class="jb51code"><pre class="brush:py;">from selenium.webdriver.support.ui import Select

# 定位下拉框
select = Select(driver.find_element(By.ID, "select_id"))
# 方式1:按索引选择(从0开始)
select.select_by_index(1)
# 方式2:按值选择(option的value属性)
select.select_by_value("option_value")
# 方式3:按文本选择
select.select_by_visible_text("选项文本")

# 获取所有选项
options = select.options
for option in options:
    print(option.text)
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>五、进阶技巧:反爬规避与效率优化</h2>
<p class="maodian"><a name="_lab2_4_13"></a></p><h3>1. 配置无界面模式(后台运行)</h3>
<div class="jb51code"><pre class="brush:py;">from selenium.webdriver.chrome.options import Options

# 创建Chrome配置对象
chrome_options = Options()
# 开启无界面模式
chrome_options.add_argument("--headless=new")
# 禁用GPU(避免无界面模式报错)
chrome_options.add_argument("--disable-gpu")

# 初始化浏览器(带配置)
driver = webdriver.Chrome(
    service=Service(driver_path),
    options=chrome_options
)
</pre></div>
<p class="maodian"><a name="_lab2_4_14"></a></p><h3>2. 规避浏览器指纹检测</h3>
<div class="jb51code"><pre class="brush:py;"># 禁用自动化提示(去除“Chrome正受到自动测试软件控制”)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
# 禁用Blink运行时功能
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
# 设置用户代理(UA)
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")
# 移除webdriver属性(关键反爬)
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () =&gt; undefined})")
</pre></div>
<p class="maodian"><a name="_lab2_4_15"></a></p><h3>3. 多标签页/窗口操作</h3>
<div class="jb51code"><pre class="brush:py;"># 打开新标签页
driver.execute_script("window.open('https://www.taobao.com')")
# 获取所有标签页句柄
windows = driver.window_handles
# 切换到第二个标签页
driver.switch_to.window(windows)
# 关闭当前标签页
driver.close()
# 切回第一个标签页
driver.switch_to.window(windows)
</pre></div>
<p class="maodian"><a name="_lab2_4_16"></a></p><h3>4. 截图与日志</h3>
<div class="jb51code"><pre class="brush:py;"># 页面全屏截图
driver.save_screenshot("page.png")
# 元素截图
element = driver.find_element(By.ID, "kw")
element.screenshot("element.png")

# 查看浏览器日志(排查错误)
logs = driver.get_log("browser")
for log in logs:
    print(log)
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>六、实战案例:爬取JS动态加载的商品数据</h2>
<p>以某电商平台商品列表为例(JS动态加载),爬取商品名称、价格、销量:</p>
<div class="jb51code"><pre class="brush:py;">from selenium import webdriver
from selenium.webdriver.chrome.service import Service
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

# 配置驱动路径
driver_path = "C:/chromedriver.exe"
# 初始化浏览器
driver = webdriver.Chrome(service=Service(driver_path))
driver.maximize_window()
driver.implicitly_wait(10)

try:
    # 打开商品列表页
    driver.get("https://xxx.com/goods-list")
   
    # 滚动页面加载更多商品(模拟翻页)
    for i in range(3):# 滚动3次
      # 滚动到页面底部
      driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
      time.sleep(2)# 等待数据加载
   
    # 定位所有商品元素
    goods_list = WebDriverWait(driver, 10).until(
      EC.presence_of_all_elements_located((By.CLASS_NAME, "goods-item"))
    )
   
    # 解析商品信息
    for goods in goods_list:
      # 商品名称
      name = goods.find_element(By.CLASS_NAME, "goods-name").text
      # 商品价格
      price = goods.find_element(By.CLASS_NAME, "goods-price").text
      # 商品销量
      sales = goods.find_element(By.CLASS_NAME, "goods-sales").text
      
      print(f"名称:{name},价格:{price},销量:{sales}")

finally:
    # 关闭浏览器
    driver.quit()
</pre></div>
<p class="maodian"><a name="_label6"></a></p><h2>七、常见问题与避坑指南</h2>
<ol><li><strong>驱动版本不匹配</strong>:报错&ldquo;SessionNotCreatedException&rdquo;,需下载与浏览器版本完全一致的驱动;</li><li><strong>元素定位失败</strong>:<ul><li>检查元素是否在iframe内(需先切换iframe);</li><li>检查元素是否动态加载(用显式等待替代强制等待);</li><li>避免使用绝对XPath(页面结构变化易失效);</li></ul></li><li><strong>反爬检测</strong>:被网站识别为爬虫时,添加UA、禁用自动化提示、随机滚动/点击间隔;</li><li><strong>内存泄漏</strong>:务必用<code>driver.quit()</code>关闭浏览器(而非<code>driver.close()</code>),避免进程残留;</li><li><strong>中文乱码</strong>:爬取的文本乱码时,添加编码设置:<code>driver.execute_script(&quot;document.charset=&#39;utf-8&#39;&quot;)</code>。</li></ol>
頁: [1]
查看完整版本: 从入门到精通解析Python Selenium如何模拟浏览器操作