Python使用Selenium模拟浏览器操作的完整指南

Written by

in

文章目录
  • Selenium 核心价值在于模拟真实用户的浏览器操作行为,能够精准还原打开页面、输入文本、点击按钮、滚动页面等一系列操作,完美解决动态 网页的数据爬取和自动化场景需求。本文将从实操角度出发,详细讲解 Selenium 模拟各类浏览器操作的核心方法,附带完整可运行代码。
  • 已安装 Selenium 库:pip install selenium -i https://pypi.doubanio.com/simple/ 已配置对应浏览器驱动(ChromeDriver 优先,版本与浏览器大版本一致) 核心导入模块(后续示例默认包含以下导入): from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time
  • 这是模拟浏览器操作的第一步,完成浏览器的启动、配置与目标网页的访问。
  • 模拟浏览器操作的核心是「先定位元素,再执行操作」,Selenium 提供了 6 种常用定位方式,其中 ID、XPath、CSS 选择器 最为实用,优先掌握。 定位方式 语法(By.XXX) 适用场景 ID 定位 By.ID 元素 ID 唯一(高效精准,优先使用) XPath 定位 By.XPATH 万能灵活,可应对复杂页面(无唯一 ID/Class 时首选) CSS 选择器 By.CSS_SELECTOR 高效,与前端开发语法一致 Name 定位 By.NAME 元素有唯一 name 属性 标签名定位 By.TAG_NAME 批量查找相同标签(如所有 <a> 标签) 链接文本定位 By.LINK_TEXT 精准匹配 <a> 标签的完整文本
  • 动态 网页存在加载延迟,直接执行操作可能会因元素未加载完成而抛出 NoSuchElementException 异常。Selenium 提供 3 种等待策略,显式等待 是最优选择。
  • from selenium import webdriver 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 bs4 import BeautifulSoup import time def simulate_browser_operation(): # 1. 初始化浏览器 driver = webdriver.Chrome() driver.maximize_window() target_url = “https://www.baidu.com” try: # 2. 访问网页 driver.get(target_url) print(f”已访问:{target_url}”) # 3. 显式等待搜索框,输入关键词并提交 wait = WebDriverWait(driver, 10) search_input = wait.until( EC.element_to_be_clickable((By.ID, “kw”)), message=”超时:搜索框未加载完成” ) search_input.send_keys(“Selenium 模拟浏览器操作 实战”) search_input.send_keys(Keys.ENTER) print(“已提交搜索,等待结果加载”) time.sleep(3) # 4. 模拟滚动页面,查看更多结果 driver.execute_script(“window.scrollTo(0, 1000);”) print(“已滚动到搜索结果中部”) time.sleep(2) # 5. 获取页面源码,提取第一条结果标题 html_source = driver.page_source soup = BeautifulSoup(html_source, “lxml”) first_result_title = soup.find(“h3″, class_=”t”).get_text(strip=True) print(f”n第一条搜索结果标题:{first_result_title}”) except Exception as e: print(f”操作过程中出现错误:{e}”) finally: # 6. 关闭浏览器 time.sleep(2) driver.quit() print(“n浏览器已关闭,操作流程结束”) if __name__ == “__main__”: simulate_browser_operation()
  • NoSuchElementException(未找到元素):① 检查定位表达式(ID、XPath)是否正确;② 页面未加载完成,替换为显式等待;③ 元素在 iframe 中,需先切换:driver.switch_to.frame(iframe_element)。 驱动与浏览器版本不匹配:下载与浏览器大版本一致的驱动(如 Chrome 119.x 对应 ChromeDriver 119.x),避免过新或过旧。 点击操作无响应:① 元素被遮挡(如广告弹窗),先关闭弹窗;② 元素不可点击,等待 EC.element_to_be_clickable() 条件满足。 中文输入乱码:Selenium 4.x 已良好支持中文,确保浏览器编码为 UTF-8,直接使用 send_keys() 传入中文即可。 以上就是Python使用Selenium模拟浏览器操作的完整指南的详细内容,更多关于Python Selenium模拟浏览器操作的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Python使用Selenium模拟浏览器自动操作功能 Python Selenium打开指定路径浏览器的几种实现方法 Python+Selenium实现无头浏览器网页截图 Python Selenium如何切换浏览器的页面
  • 目录
    • 引言
    • 一、前期准备(回顾必备)
    • 二、基础操作:初始化浏览器与访问网页
      • 1. 基础初始化(可视化模式)
      • 2. 无界面模式(后台运行,不显示浏览器窗口)
    • 三、核心操作1:定位页面元素(操作的前提)
      • 实操示例(以百度首页为例)
    • 四、核心操作2:模拟用户常用交互行为
      • 1. 输入与清空文本(如搜索框、登录输入框)
      • 2. 模拟点击操作(按钮、链接、复选框等)
      • 3. 模拟页面滚动(应对滚动加载、查看更多内容)
      • 4. 浏览器窗口辅助操作(刷新、前进、后退、关闭)
    • 五、关键优化:等待元素加载(避免操作失败)
      • 1. 强制等待(最简单,不推荐)
      • 2. 隐式等待(全局生效,中等推荐)
      • 3. 显式等待(灵活高效,强烈推荐)
    • 六、完整实战:模拟浏览器完成搜索+滚动+数据提取
      • 七、常见问题与解决办法

        Selenium 核心价值在于模拟真实用户的浏览器操作行为,能够精准还原打开页面、输入文本、点击按钮、滚动页面等一系列操作,完美解决动态 网页的数据爬取和自动化场景需求。本文将从实操角度出发,详细讲解 Selenium 模拟各类浏览器操作的核心方法,附带完整可运行代码。

        1. 已安装 Selenium 库:pip install selenium -i https://pypi.doubanio.com/simple/
        2. 已配置对应浏览器驱动(ChromeDriver 优先,版本与浏览器大版本一致)
        3. 核心导入模块(后续示例默认包含以下导入):
        from selenium import webdriver
        from selenium.webdriver.common.by import By
        from selenium.webdriver.common.keys import Keys
        import time
        

        这是模拟浏览器操作的第一步,完成浏览器的启动、配置与目标网页的访问。

        # 1. 初始化 Chrome 浏览器驱动(启动浏览器)
        driver = webdriver.Chrome()
        
        # 2. 可选:最大化浏览器窗口(模拟用户正常使用习惯)
        driver.maximize_window()
        
        # 3. 访问目标网页(get 方法会等待页面初步加载完成)
        target_url = "https://www.baidu.com"
        driver.get(target_url)
        print(f"已成功访问:{target_url},当前页面标题:{driver.title}")
        
        # 4. 可选:短暂延时,确保页面完全渲染(后续优先使用显式等待)
        time.sleep(2)
        

        适合服务器运行或无需可视化的场景,节省系统资源:

        # 1. 构造 Chrome 配置对象
        chrome_options = webdriver.ChromeOptions()
        # 启用无界面模式(Selenium 4.x 推荐写法)
        chrome_options.add_argument("--headless=new")
        # 禁用 GPU 加速,避免部分环境报错
        chrome_options.add_argument("--disable-gpu")
        
        # 2. 传入配置初始化浏览器
        driver = webdriver.Chrome(options=chrome_options)
        driver.get("https://www.baidu.com")
        print(f"无界面模式:页面标题为 {driver.title}")
        

        模拟浏览器操作的核心是「先定位元素,再执行操作」,Selenium 提供了 6 种常用定位方式,其中 ID、XPath、CSS 选择器 最为实用,优先掌握。

        定位方式 语法(By.XXX) 适用场景
        ID 定位 By.ID 元素 ID 唯一(高效精准,优先使用)
        XPath 定位 By.XPATH 万能灵活,可应对复杂页面(无唯一 ID/Class 时首选)
        CSS 选择器 By.CSS_SELECTOR 高效,与前端开发语法一致
        Name 定位 By.NAME 元素有唯一 name 属性
        标签名定位 By.TAG_NAME 批量查找相同标签(如所有 <a> 标签)
        链接文本定位 By.LINK_TEXT 精准匹配 <a> 标签的完整文本

        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get("https://www.baidu.com")
        time.sleep(2)
        
        # 1. ID 定位(百度搜索框 ID 为 "kw")
        search_input = driver.find_element(By.ID, "kw")
        print("ID 定位成功:", search_input.tag_name)
        
        # 2. XPath 定位(相对路径,容错性强)
        search_button = driver.find_element(By.XPATH, '//input[@id="su"]')
        print("XPath 定位成功:", search_button.tag_name)
        
        # 3. CSS 选择器定位(# 表示 ID,. 表示 Class)
        news_link = driver.find_element(By.CSS_SELECTOR, 'a[href="https://news.baidu.com" rel="external nofollow" ]')
        print("CSS 选择器定位成功:", news_link.text)
        
        driver.quit()
        

        说明:driver.find_element() 返回第一个匹配元素,driver.find_elements() 返回所有匹配元素列表(无匹配返回空列表)。

        使用 send_keys() 输入文本,clear() 清空输入框内容,是表单操作的核心方法。

        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get("https://www.baidu.com")
        time.sleep(2)
        
        # 1. 定位搜索框,输入关键词
        search_input = driver.find_element(By.ID, "kw")
        search_input.send_keys("Selenium 模拟浏览器操作")  # 输入任意文本(支持中文)
        print("已输入搜索关键词")
        time.sleep(2)
        
        # 2. 清空搜索框内容(可选)
        search_input.clear()
        print("已清空搜索框")
        time.sleep(1)
        
        # 3. 重新输入并回车提交搜索(结合 Keys 类模拟键盘操作)
        search_input.send_keys("Python 爬虫进阶")
        search_input.send_keys(Keys.ENTER)  # 模拟按下回车键
        print("已提交搜索,等待结果加载")
        time.sleep(3)
        
        driver.quit()
        

        使用 click() 方法模拟用户左键点击,支持所有可点击元素(按钮、<a> 标签、单选框等)。

        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get("https://www.baidu.com")
        time.sleep(2)
        
        # 1. 定位搜索框,输入关键词
        search_input = driver.find_element(By.ID, "kw")
        search_input.send_keys("Selenium 教程")
        
        # 2. 定位搜索按钮,模拟点击提交
        search_button = driver.find_element(By.ID, "su")
        search_button.click()  # 核心点击方法
        print("点击搜索按钮,提交查询")
        time.sleep(3)
        
        # 3. 定位搜索结果中的链接,点击跳转
        first_result = driver.find_element(By.XPATH, '//div[@id="content_left"]//a[1]')
        first_result.click()
        print("点击第一条搜索结果,跳转新页面")
        time.sleep(3)
        
        driver.quit()
        

        动态 网页常需要滚动页面才能加载更多数据,Selenium 推荐使用 execute_script() 执行 JavaScript 脚本实现滚动,万能且稳定。

        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get("https://www.runoob.com/python/python-blog.html")
        time.sleep(2)
        
        # 1. 滚动到页面底部(获取完整动态数据)
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        print("已滚动到页面底部")
        time.sleep(3)
        
        # 2. 滚动到页面顶部
        driver.execute_script("window.scrollTo(0, 0);")
        print("已滚动到页面顶部")
        time.sleep(2)
        
        # 3. 滚动到指定位置(横向 x=0,纵向 y=800 像素)
        driver.execute_script("window.scrollTo(0, 800);")
        print("已滚动到页面 y=800 位置")
        time.sleep(2)
        
        # 4. 模拟逐页滚动(PageDown 键)
        driver.find_element(By.TAG_NAME, "body").send_keys(Keys.PAGE_DOWN)
        print("已向下滚动一页")
        time.sleep(2)
        
        driver.quit()
        

        模拟用户对浏览器窗口的常用操作,完善自动化流程:

        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get("https://www.baidu.com")
        time.sleep(2)
        
        # 1. 刷新当前页面
        driver.refresh()
        print("已刷新页面")
        time.sleep(2)
        
        # 2. 访问新页面(为后续前进/后退做准备)
        driver.get("https://www.runoob.com")
        print("已访问菜鸟教程")
        time.sleep(2)
        
        # 3. 后退到上一个页面(百度首页)
        driver.back()
        print("已后退到百度首页")
        time.sleep(2)
        
        # 4. 前进到下一个页面(菜鸟教程)
        driver.forward()
        print("已前进到菜鸟教程")
        time.sleep(2)
        
        # 5. 关闭浏览器(释放所有资源,推荐使用 quit() 而非 close())
        # driver.close()  # 关闭当前窗口(多窗口时适用)
        driver.quit()  # 退出浏览器,释放所有资源
        print("浏览器已关闭")
        

        动态 网页存在加载延迟,直接执行操作可能会因元素未加载完成而抛出 NoSuchElementException 异常。Selenium 提供 3 种等待策略,显式等待 是最优选择。

        time.sleep(seconds),固定延时,无论页面是否加载完成都等待,适合简单场景或临时调试。

        driver.get("https://www.baidu.com")
        time.sleep(2)  # 固定等待 2 秒
        

        通过 driver.implicitly_wait(seconds) 设置全局等待时间,在指定时间内会不断尝试定位元素,直到找到或超时。

        driver = webdriver.Chrome()
        # 设置隐式等待 10 秒(全局生效,仅对元素定位操作有效)
        driver.implicitly_wait(10)
        driver.get("https://www.baidu.com")
        
        # 若 10 秒内找到元素则立即执行,否则抛出异常
        search_input = driver.find_element(By.ID, "kw")
        search_input.send_keys("隐式等待测试")
        driver.quit()
        

        通过 WebDriverWait 配合 expected_conditions,针对单个元素设置个性化等待条件(如元素可见、可点击),超时后抛出明确异常,适合复杂动态页面。

        from selenium.webdriver.support.ui import WebDriverWait
        from selenium.webdriver.support import expected_conditions as EC
        
        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get("https://www.baidu.com")
        
        # 1. 构造显式等待对象(最长等待 10 秒,每 0.5 秒检查一次条件)
        wait = WebDriverWait(driver, 10, poll_frequency=0.5)
        
        # 2. 等待搜索框可点击(常用条件:element_to_be_clickable)
        search_input = wait.until(
            EC.element_to_be_clickable((By.ID, "kw")),
            message="超时:未找到可点击的百度搜索框"
        )
        
        # 3. 元素加载完成后执行操作
        search_input.send_keys("显式等待测试")
        print("输入成功,等待条件满足")
        
        driver.quit()
        

        常用等待条件:EC.visibility_of_element_located()(元素可见)、EC.presence_of_element_located()(元素存在于 DOM 中)、EC.element_to_be_clickable()(元素可点击)。

        from selenium import webdriver
        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 bs4 import BeautifulSoup
        import time
        
        def simulate_browser_operation():
            # 1. 初始化浏览器
            driver = webdriver.Chrome()
            driver.maximize_window()
            target_url = "https://www.baidu.com"
            
            try:
                # 2. 访问网页
                driver.get(target_url)
                print(f"已访问:{target_url}")
                
                # 3. 显式等待搜索框,输入关键词并提交
                wait = WebDriverWait(driver, 10)
                search_input = wait.until(
                    EC.element_to_be_clickable((By.ID, "kw")),
                    message="超时:搜索框未加载完成"
                )
                search_input.send_keys("Selenium 模拟浏览器操作 实战")
                search_input.send_keys(Keys.ENTER)
                print("已提交搜索,等待结果加载")
                time.sleep(3)
                
                # 4. 模拟滚动页面,查看更多结果
                driver.execute_script("window.scrollTo(0, 1000);")
                print("已滚动到搜索结果中部")
                time.sleep(2)
                
                # 5. 获取页面源码,提取第一条结果标题
                html_source = driver.page_source
                soup = BeautifulSoup(html_source, "lxml")
                first_result_title = soup.find("h3", class_="t").get_text(strip=True)
                print(f"n第一条搜索结果标题:{first_result_title}")
            
            except Exception as e:
                print(f"操作过程中出现错误:{e}")
            
            finally:
                # 6. 关闭浏览器
                time.sleep(2)
                driver.quit()
                print("n浏览器已关闭,操作流程结束")
        
        if __name__ == "__main__":
            simulate_browser_operation()
        

        1. NoSuchElementException(未找到元素):① 检查定位表达式(ID、XPath)是否正确;② 页面未加载完成,替换为显式等待;③ 元素在 iframe 中,需先切换:driver.switch_to.frame(iframe_element)
        2. 驱动与浏览器版本不匹配:下载与浏览器大版本一致的驱动(如 Chrome 119.x 对应 ChromeDriver 119.x),避免过新或过旧。
        3. 点击操作无响应:① 元素被遮挡(如广告弹窗),先关闭弹窗;② 元素不可点击,等待 EC.element_to_be_clickable() 条件满足。
        4. 中文输入乱码:Selenium 4.x 已良好支持中文,确保浏览器编码为 UTF-8,直接使用 send_keys() 传入中文即可。

        以上就是Python使用Selenium模拟浏览器操作的完整指南的详细内容,更多关于Python Selenium模拟浏览器操作的资料请关注风君子博客其它相关文章!

        您可能感兴趣的文章:

        • Python使用Selenium模拟浏览器自动操作功能
        • Python Selenium打开指定路径浏览器的几种实现方法
        • Python+Selenium实现无头浏览器网页截图
        • Python Selenium如何切换浏览器的页面

        站内搜索