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

No23: 使用 Selenium 自动化浏览器操作


摘要

Selenium 是自动化浏览器操作的"瑞士军刀",可模拟人类行为操作网页,适用于爬虫、测试、重复任务自动化等场景。本集通过代码驱动实战,从安装配置到复杂交互,带你掌握 Selenium 的核心技能,并结合电商网站登录、商品下单等真实场景,解决动态加载、反爬等实际问题。


核心概念与代码实战

1. 环境配置与 WebDriver 基础

安装命令

bash 复制代码
pip install selenium webdriver-manager  

初始化浏览器(自动管理驱动):

python 复制代码
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()))  

效果验证

python 复制代码
driver.get("https://www.python.org")  
print(driver.title)  # 输出: "Welcome to Python.org"  

2. 元素定位与交互

常见定位方式

python 复制代码
# 通过 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()  

动态交互示例(鼠标悬停与下拉菜单选择):

python 复制代码
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):

python 复制代码
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. 反爬策略与绕过技巧

常见反爬手段与应对

python 复制代码
# 修改 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:自动化登录与数据抓取

场景:登录某电商后台,提取订单数据。

python 复制代码
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:商品搜索与下单
python 复制代码
# 搜索商品  
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:网页性能测试
python 复制代码
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 模式提升效率
python 复制代码
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+
相关推荐
蹦蹦跳跳真可爱58939 分钟前
Python----数据分析(Pandas三:一维数组Series的数据操作:数据清洗,数据转换,数据排序,数据筛选,数据拼接)
python·数据分析·pandas
*星星之火*1 小时前
【GPT入门】第20课 langchain的function calling 初步体验
python·gpt·langchain
李恩泽的博客1 小时前
Python Paramiko模块
python
色楠不哭1 小时前
python包filterpy安装失败ModuleNotFoundError: No module named ‘filterpy‘
开发语言·python
Aaron.Ma1 小时前
Django 问题
python·django·sqlite
范哥来了1 小时前
python web开发flask库安装与使用
前端·python·flask
爱做ppt的阿伟1 小时前
一键爬取b站视频
python·音视频
李恩泽的博客1 小时前
Python 使用PIL将图片或GIF转字符画
python
斯内普的小巨怪2 小时前
项目问答(自用记录)
python
程序员的世界你不懂2 小时前
Python基础入门掌握(二)
百度·自动化