Python Web 自动化神器:Selenium 超详细入门教程 (Zero to Hero)
目录
专栏导读
❤️ 欢迎各位佬关注! ❤️
文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
📕 此外还有python基础专栏:请点击——>Python基础学习专栏 求订阅
🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏 求订阅
👍 该系列文章专栏:请点击——>Python办公自动化专栏 求订阅
🏳️🌈 ZEEKLOG博客主页:请点击——> ZEEKLOG的博客主页 求关注
🏳️🌈 知乎主页:请点击——> 知乎主页 求关注
🏳️🌈 Github主页:请点击——> Github主页 求Star⭐
🏳️🌈 个人博客主页:请点击——> 个人的博客主页 求收藏
🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手
Python Web 自动化神器:Selenium 超详细入门教程 (Zero to Hero)
在当今的数据驱动时代,Web 自动化技术变得越来越重要。无论是为了自动化测试、数据采集(爬虫),还是为了处理繁琐的重复性网页操作,Selenium 无疑是 Python 生态中最强大、最流行的工具之一。
本教程旨在为完全零基础的初学者提供一份系统、详尽的 Selenium 指南。我们将从环境搭建开始,一步步深入到核心操作,最终助你编写出稳定的自动化脚本。
点击 投票 获取Python办公自动化高清书籍
(Excel Python:飞速搞定数据分析与处理 (【瑞士】费利克斯·朱姆斯坦) )**
1. 什么是 Selenium?
Selenium 最初是为 Web 应用程序的自动化测试而设计的开源工具。它可以通过代码模拟真实用户在浏览器中的操作,例如点击按钮、输入文本、滚动页面等。
为什么选择 Selenium?
- 跨浏览器/平台: 支持 Chrome、Firefox、Edge、Safari 等主流浏览器,且支持 Windows, Mac, Linux。
- 多语言支持: 虽然本教程使用 Python,但 Selenium 也支持 Java, C#, Ruby 等。
- 所见即所得: 你能亲眼看到浏览器自动打开并执行操作,非常直观,便于调试。
2. 环境搭建 (Prerequisites)
在开始写代码之前,我们需要准备好“武器库”。
2.1 安装 Python
确保你的电脑上已经安装了 Python (建议 3.7+ 版本)。
在终端(Terminal 或 CMD)输入以下命令检查:
python --version 2.2 安装 Selenium 库
使用 pip 安装 Selenium 的 Python 绑定库:
pip install selenium 2.3 浏览器驱动 (Browser Drivers)
Selenium 需要一个“中间人”来和浏览器通信,这就是WebDriver。
- Chrome 用户: 需要
chromedriver - Firefox 用户: 需要
geckodriver - Edge 用户: 需要
msedgedriver
注意 (Selenium 4.x 更新):
如果你安装的是最新版的 Selenium (4.6+),它内置了 Selenium Manager,通常可以自动下载和管理驱动,你可能不需要手动配置驱动路径。但如果遇到报错,请前往 Chrome for Testing 下载与你浏览器版本一致的驱动,并将其路径添加到系统的环境变量中。
3. 快速上手:你的第一个自动化脚本
让我们来写一个简单的脚本:打开 Chrome 浏览器,访问百度。
from selenium import webdriver import time # 1. 实例化浏览器驱动 (这里使用 Chrome)# 如果驱动配置正确,这里会自动启动一个空白的 Chrome 窗口 driver = webdriver.Chrome()# 2. 访问网页 driver.get("https://www.baidu.com")# 3. 打印当前网页标题print(f"当前网页标题: {driver.title}")# 4. 强制等待 3 秒 (仅为了演示,让你看清效果) time.sleep(3)# 5. 关闭浏览器并释放资源 driver.quit()4. 核心技能:元素定位 (Locating Elements)
要想操作页面上的元素(比如搜索框、登录按钮),首先必须找到它。Selenium 提供了多种定位策略。
前置导入:
在 Selenium 4 中,推荐使用 By 类来指定定位方式。
from selenium.webdriver.common.by import By 常用定位方式一览
| 定位方式 | 代码示例 | 描述 | 推荐指数 |
|---|---|---|---|
| ID | driver.find_element(By.ID, "kw") | 元素的 id 属性,通常是唯一的。 | ⭐⭐⭐⭐⭐ (最快) |
| Name | driver.find_element(By.NAME, "wd") | 元素的 name 属性,常用于表单。 | ⭐⭐⭐⭐ |
| Class Name | driver.find_element(By.CLASS_NAME, "s_ipt") | 元素的 class 属性。 | ⭐⭐⭐ |
| XPath | driver.find_element(By.XPATH, "//input[@id='kw']") | 极其强大,可定位任何元素,但语法较复杂且速度稍慢。 | ⭐⭐⭐⭐ (万能) |
| CSS Selector | driver.find_element(By.CSS_SELECTOR, "#kw") | 语法简洁,渲染速度比 XPath 快,前端开发常用。 | ⭐⭐⭐⭐⭐ (推荐) |
| Link Text | driver.find_element(By.LINK_TEXT, "新闻") | 精确匹配超链接文本。 | ⭐⭐⭐ |
如何获取这些属性?
在浏览器中右键点击你想操作的元素,选择**“检查” (Inspect)**,在开发者工具中查看 HTML 代码。
5. 元素交互 (Interacting with Elements)
找到元素后,我们需要对其进行操作。
5.1 常用操作方法
# 假设我们定位到了百度的搜索框 search_box = driver.find_element(By.ID,"kw")# 1. 输入文本 search_box.send_keys("Python Selenium 教程")# 2. 清空文本 (如果输入框里已有内容) search_box.clear() search_box.send_keys("Selenium 自动化")# 3. 点击操作 (假设定位到了“百度一下”按钮) search_btn = driver.find_element(By.ID,"su") search_btn.click()# 4. 获取元素文本 result_text = driver.find_element(By.CLASS_NAME,"result-title").text print(result_text)# 5. 获取元素属性 (例如获取链接地址 href) link = driver.find_element(By.TAG_NAME,"a").get_attribute("href")6. 等待策略:让脚本更稳定 (Waiting Strategies)
这是新手最容易踩坑的地方!
网页加载需要时间,如果代码执行速度快于网页加载速度,就会报 NoSuchElementException 错误。我们需要让 Python “等一等” 浏览器。
6.1 强制等待 (不推荐)
import time time.sleep(5)# 死等 5 秒,不管网页是否加载完缺点:浪费时间,效率低。
6.2 隐式等待 (Implicit Wait)
设置一个全局的最长等待时间。如果在规定时间内元素出现了,就立即执行;如果超时,则报错。
# 在 driver 初始化后设置一次即可 driver.implicitly_wait(10)# 最多等 10 秒缺点:只能判断元素是否存在,无法判断元素是否可见或可点击。
6.3 显式等待 (Explicit Wait) - 强烈推荐
针对特定元素设置特定的等待条件。这是最灵活、最稳定的方式。
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 设置最长等待 10 秒 wait = WebDriverWait(driver,10)# 等待 ID 为 "su" 的元素变为【可点击】状态,然后再执行点击 submit_btn = wait.until(EC.element_to_be_clickable((By.ID,"su"))) submit_btn.click()7. 实战演练:自动化搜索并截图
我们将把以上知识点串联起来,完成一个完整的任务:
- 打开百度。
- 输入关键词。
- 点击搜索。
- 滚动到底部。
- 截图保存。
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 import time defdemo_baidu_search():# 1. 初始化配置 options = webdriver.ChromeOptions()# options.add_argument("--headless") # 如果不想看到浏览器界面,可开启无头模式 driver = webdriver.Chrome(options=options) driver.maximize_window()# 最大化窗口try:# 2. 访问网站 driver.get("https://www.baidu.com")# 3. 显式等待搜索框出现 wait = WebDriverWait(driver,10) search_input = wait.until(EC.presence_of_element_located((By.ID,"kw")))# 4. 输入内容并回车 (模拟键盘回车,替代点击按钮) search_input.send_keys("Selenium Python") search_input.send_keys(Keys.RETURN)# 5. 等待搜索结果加载 (通过定位底部的分页条来确认加载完成) wait.until(EC.presence_of_element_located((By.ID,"page")))# 6. 执行 JavaScript 滚动到底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2)# 稍微等待滚动动画# 7. 截图 driver.save_screenshot("baidu_result.png")print("截图已保存!")except Exception as e:print(f"发生错误: {e}")finally:# 8. 无论成功失败,务必关闭驱动 driver.quit()if __name__ =="__main__": demo_baidu_search()8. 常见避坑指南 (Common Pitfalls)
- Driver 版本不匹配:
- 现象: 报错
SessionNotCreatedException。 - 解决: 更新 Chrome 浏览器,并重新下载对应版本的 ChromeDriver,或者更新 Selenium 库以使用 Selenium Manager。
- 现象: 报错
- 元素不可见/不可交互:
- 现象: 报错
ElementNotInteractableException。 - 原因: 元素被遮挡、元素还在加载中、或者元素在
<iframe>内部。 - 解决: 使用显式等待;如果是 iframe,需先使用
driver.switch_to.frame()切换进去。
- 现象: 报错
- 被网站识别为爬虫:
- 现象: 出现滑块验证码或直接被拦截。
- 解决: Selenium 即使模拟浏览器,也会带有自动化特征(如
window.navigator.webdriver属性为 true)。可以通过修改 ChromeOptions 隐藏特征,但高级反爬需要更复杂的技术对抗。
- 忘记 quit():
- 现象: 脚本运行多次后,电脑内存爆满,后台有大量
chromedriver进程。 - 解决: 务必使用
try...finally...结构确保driver.quit()被执行。
- 现象: 脚本运行多次后,电脑内存爆满,后台有大量
9. 总结与进阶资源
恭喜你!你已经掌握了 Selenium 的核心基础。你现在可以打开浏览器,定位元素,并编写脚本让它自动工作了。
进阶学习建议:
- Page Object Model (POM): 学习设计模式,将页面定位逻辑与业务逻辑分离,让代码更易维护。
- 处理复杂控件: 学习如何处理下拉框 (
Select类)、弹出框 (Alert)、多窗口切换 (switch_to.window)。 - Pytest 结合: 将 Selenium 结合测试框架 Pytest,编写专业的自动化测试用例。
Selenium 是一个通过实践掌握的工具。现在,试着去写一个自动化登录你常用网站的脚本吧(注意不要用于非法用途)!
Happy Coding! 🚀