下面给你一份**《Selenium 实战指南》,不是只讲 API,而是从环境搭建 → 核心操作 → 真实场景 → 反爬与稳定性 → 项目级结构**,按**“能跑 + 能用 + 能抗”**的标准来写,特别适合你这种做 爬虫 / 自动化 / 实战项目 的场景。
一、Selenium 是什么?适合干什么?
1️⃣ Selenium 的定位
Selenium = 控制真实浏览器的自动化工具
它能做的事:
- 自动打开网页
- 自动点击 / 输入 / 提交表单
- 执行 JS
- 模拟真实用户行为
2️⃣ Selenium vs Requests
| 对比 | Requests | Selenium |
|---|---|---|
| JS 渲染 | ❌ | ✅ |
| 模拟点击 | ❌ | ✅ |
| 登录验证码 | ❌ | 部分可 |
| 速度 | 快 | 慢 |
| 反爬识别 | 低 | 高 |
👉 结论:
- JS 重的网站 / 登录流程 / 动态加载 → Selenium
- 接口稳定 → Requests
二、环境搭建(Python 实战)
1️⃣ 安装 Selenium
pip install selenium
👉 推荐 Selenium 4.x
2️⃣ 安装浏览器驱动(重点)
✅ Chrome(最常用)
- Chrome ≥ 115
👉 Selenium 4.10+ 已支持自动管理驱动
无需手动下载 chromedriver
3️⃣ 第一个 Selenium 程序
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print(driver.title)
driver.quit()
能正常打开浏览器 → 环境 OK ✅
三、核心对象与结构(必须懂)
1️⃣ WebDriver
- 浏览器控制器
- 负责:打开网页、前进、后退、关闭
driver.get(url)
driver.back()
driver.refresh()
driver.quit()
2️⃣ WebElement
- 页面上的一个元素
- 可以:
- 点击
- 输入
- 读取文本 / 属性
四、元素定位(80% 的问题在这里)
1️⃣ 八种定位方式(重点)
from selenium.webdriver.common.by import By
| 方式 | 示例 |
|---|---|
| ID | By.ID |
| NAME | By.NAME |
| CLASS | By.CLASS_NAME |
| TAG | By.TAG_NAME |
| LINK | By.LINK_TEXT |
| CSS | By.CSS_SELECTOR |
| XPATH | By.XPATH |
2️⃣ 推荐优先级(实战经验)
ID > CSS > XPath > 其他
CSS 示例
driver.find_element(By.CSS_SELECTOR, "#kw")
XPath 示例
driver.find_element(By.XPATH, "//input[@id='kw']")
3️⃣ XPath 实战写法(必会)
//div[@class='item']
//a[contains(text(),'登录')]
//input[starts-with(@id,'user')]
五、常见操作大全
1️⃣ 输入 & 点击
el = driver.find_element(By.ID, "kw")
el.send_keys("selenium")
el.clear()
driver.find_element(By.ID, "su").click()
2️⃣ 获取信息
el.text
el.get_attribute("href")
3️⃣ 下拉 & 滚动
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
4️⃣ iframe 切换(高频坑)
driver.switch_to.frame("iframe_id")
driver.switch_to.default_content()
5️⃣ 新窗口 / 标签页
handles = driver.window_handles
driver.switch_to.window(handles[-1])
六、等待机制(稳定性的核心)
❌ 禁止大量使用 time.sleep()
1️⃣ 隐式等待(全局)
driver.implicitly_wait(10)
2️⃣ 显式等待(推荐)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "kw"))
)
👉 实战首选
七、实战案例 1:自动搜索并抓取结果
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
kw = driver.find_element(By.ID, "kw")
kw.send_keys("Python Selenium")
kw.send_keys(Keys.ENTER)
titles = driver.find_elements(By.CSS_SELECTOR, "h3")
for t in titles:
print(t.text)
driver.quit()
八、反爬 & 稳定性技巧(非常重要)
1️⃣ 常见 Selenium 被识别点
navigator.webdriver = true- 无头模式
- 操作速度固定
- UA 异常
2️⃣ 隐藏 webdriver(基础)
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
driver.execute_script(
"Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
)
3️⃣ 人类行为模拟
import random, time
time.sleep(random.uniform(1, 3))
4️⃣ Headless(慎用)
options.add_argument("--headless=new")
👉 爬虫不推荐,容易被封
九、项目级 Selenium 结构(推荐)
selenium_project/
│
├── driver/
│ └── browser.py
├── pages/
│ └── login_page.py
├── utils/
│ ├── wait.py
│ └── logger.py
├── main.py
👉 Page Object 模式(POM)
十、Selenium 常见异常速查
| 异常 | 原因 |
|---|---|
| NoSuchElement | 定位错误 |
| TimeoutException | 等待不足 |
| StaleElement | 页面刷新 |
| ElementNotInteractable | 元素不可点击 |
十一、Selenium + Requests 混合模式(高级)
用 Selenium 登录 → 拿 Cookie → Requests 跑接口
cookies = driver.get_cookies()
效率直接起飞 🚀
十二、什么时候该“放弃 Selenium”?
- 页面接口可直接抓
- 网站强反自动化
- 对性能要求极高
👉 改用:
- Playwright
- 抓接口 + 模拟签名
最后一句总结
Selenium 是“最后的武器”,不是第一选择,但一旦用上,必须用对。
发表回复