《Python实战进阶》No23: 使用 Selenium 自动化浏览器操作

发布于:2025-03-16 ⋅ 阅读:(33) ⋅ 点赞:(0)

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:轻量级静态页面爬取

总结

通过本集实战,你已掌握:

  1. Selenium 动态页面操作的核心技能
  2. 反爬策略的攻防实战
  3. 电商自动化全流程(登录→搜索→下单→性能测试)
  4. 性能优化与替代方案选择

下集预告
《No24: PyAutoGUI 实现桌面自动化》将带你突破浏览器限制,自动化操作文件管理器、Excel 等桌面应用,实现全栈自动化!


附:运行环境

  • 环境要求:Python 3.8+、Chrome 114+

网站公告

今日签到

点亮在社区的每一天
去签到