No23: 使用 Selenium 自动化浏览器操作
摘要
Selenium 是自动化浏览器操作的“瑞士军刀”,可模拟人类行为操作网页,适用于爬虫、测试、重复任务自动化等场景。本集通过代码驱动实战,从安装配置到复杂交互,带你掌握 Selenium 的核心技能,并结合电商网站登录、商品下单等真实场景,解决动态加载、反爬等实际问题。
核心概念与代码实战
1. 环境配置与 WebDriver 基础
安装命令:
pip install selenium webdriver-manager
初始化浏览器(自动管理驱动):
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()))
效果验证:
driver.get("https://www.python.org")
print(driver.title) # 输出: "Welcome to Python.org"
2. 元素定位与交互
常见定位方式:
# 通过 ID 定位搜索框并输入关键词
search_box = driver.find_element(By.ID, "id-search-field")
search_box.send_keys("selenium")
# 通过 XPATH 点击搜索按钮
driver.find_element(By.XPATH, "//button[@type='submit']").click()
动态交互示例(鼠标悬停与下拉菜单选择):
from selenium.webdriver.common.action_chains import ActionChains
# 模拟鼠标悬停
menu = driver.find_element(By.CSS_SELECTOR, ".menu-item")
ActionChains(driver).move_to_element(menu).perform()
# 选择下拉菜单项
driver.find_element(By.LINK_TEXT, "Documentation").click()
3. 动态内容与显式等待
问题场景:页面数据通过 AJAX 动态加载,直接定位会报错。
解决方案:显式等待(Explicit Wait):
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待搜索结果加载完成
results = WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".list-recent-events li"))
)
print(f"共找到 {len(results)} 条结果")
输出示例:
共找到 5 条结果
4. 反爬策略与绕过技巧
常见反爬手段与应对:
# 修改 User-Agent
options = webdriver.ChromeOptions()
options.add_argument("user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36")
# 使用代理 IP
options.add_argument("--proxy-server=http://123.45.67.89:8080")
# 绕过 WebDriver 检测(部分网站会识别自动化脚本)
options.add_argument("--disable-blink-features=AutomationControlled")
验证码处理建议:
- 集成第三方 API(如 2Captcha)自动识别
- 使用 Pytesseract 进行简单图像验证码识别
实战案例:电商自动化全流程
案例 1:自动化登录与数据抓取
场景:登录某电商后台,提取订单数据。
driver.get("https://fake-ecommerce.com/login")
# 输入账号密码
driver.find_element(By.ID, "username").send_keys("user123")
driver.find_element(By.ID, "password").send_keys("pass123")
driver.find_element(By.CSS_SELECTOR, "button.login-btn").click()
# 抓取订单列表
orders = WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CLASS_NAME, "order-item"))
)
for order in orders:
print(order.text)
输出示例:
订单号: 20230901-001 | 状态: 已发货
订单号: 20230902-002 | 状态: 处理中
案例 2:商品搜索与下单
# 搜索商品
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("无线耳机")
search_box.submit()
# 选择第一个商品并加入购物车
driver.find_element(By.CSS_SELECTOR, ".product-item:first-child .buy-btn").click()
driver.find_element(By.ID, "checkout-btn").click()
# 提交订单(需提前登录)
driver.find_element(By.ID, "place-order").click()
案例 3:网页性能测试
import time
start_time = time.time()
driver.get("https://example.com")
load_time = time.time() - start_time
print(f"页面加载耗时:{load_time:.2f} 秒")
# 统计资源请求时间(需启用性能日志)
logs = driver.get_log("performance")
for log in logs:
if "Network.responseReceived" in log["message"]:
print(f"资源加载时间:{log['timestamp']}")
输出示例:
页面加载耗时:2.35 秒
资源加载时间:1693720000.123
扩展思考
1. Headless 模式提升效率
options = webdriver.ChromeOptions()
options.add_argument("--headless") # 无头模式
options.add_argument("--disable-gpu")
driver = webdriver.Chrome(options=options)
# 在后台静默执行任务
driver.get("https://example.com")
print(driver.title)
优势:节省内存、适合服务器环境
2. Selenium 的局限性
- 性能开销大:每个实例占用 1GB+ 内存
- 无法操作非浏览器 GUI:如桌面应用需结合 PyAutoGUI(下集详解)
替代方案推荐:
- Playwright:微软开源,支持移动端模拟和更快的执行速度
- Requests + lxml:轻量级静态页面爬取
总结
通过本集实战,你已掌握:
- Selenium 动态页面操作的核心技能
- 反爬策略的攻防实战
- 电商自动化全流程(登录→搜索→下单→性能测试)
- 性能优化与替代方案选择
下集预告:
《No24: PyAutoGUI 实现桌面自动化》将带你突破浏览器限制,自动化操作文件管理器、Excel 等桌面应用,实现全栈自动化!
附:运行环境
- 环境要求:Python 3.8+、Chrome 114+