Python网页自动化Selenium/Playwright双方案实战


网页自动化是Python办公/测试场景的高频需求,核心是模拟人工操作浏览器完成页面点击、表单填写、数据爬取、批量操作等重复工作。Selenium作为老牌工具兼容性强,Playwright是新一代工具更稳定、速度更快,本文对比讲解这两种工具的实战用法,覆盖环境搭建、核心操作、场景化案例,帮你快速掌握Python网页自动化核心技能。

一、核心工具对比与环境准备

1. Selenium vs Playwright(选对工具省一半力)

特性 Selenium(老牌) Playwright(新一代)
开发维护 社区维护 Microsoft官方维护
浏览器支持 Chrome/Firefox/Edge等 Chrome/Firefox/Edge/Safari
稳定性 易因页面加载慢出错 内置等待机制,稳定性高
速度 中等 快(异步执行)
语法 繁琐(需手动处理等待) 简洁(链式调用)
调试难度 高(需逐行排查等待问题) 低(自带录制功能)
适用场景 老旧系统、兼容性要求高 现代网页、批量自动化、测试

2. 环境安装

(1)Selenium安装(需搭配浏览器驱动)

# 安装Selenium库
pip install selenium==4.15.0  # 指定稳定版本
# 安装浏览器驱动管理工具(自动适配浏览器版本)
pip install webdriver-manager

(2)Playwright安装(自动下载浏览器和驱动)

# 安装Playwright库
pip install playwright
# 安装浏览器(Chrome/Firefox/Edge/Safari)
playwright install

3. 环境验证

(1)Selenium验证

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.baidu.com")
print("Selenium验证成功,页面标题:", driver.title)
driver.quit()

(2)Playwright验证

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # 初始化Chrome浏览器(无头模式:headless=True)
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    # 打开百度
    page.goto("https://www.baidu.com")
    print("Playwright验证成功,页面标题:", page.title())
    browser.close()

二、Selenium实战:经典网页自动化方案

Selenium适合需要兼容多浏览器、老旧网页的场景,核心是“定位元素+操作元素+等待页面加载”。

1. 核心操作:元素定位与基础操作

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager

# 1. 初始化浏览器(带隐式等待)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.implicitly_wait(10)  # 全局隐式等待:元素未加载时等待10秒
driver.maximize_window()    # 窗口最大化

# 2. 打开网页
driver.get("https://www.baidu.com")

# 3. 元素定位(8种方式,常用前4种)
# ID定位(最精准)
search_input = driver.find_element(By.ID, "kw")
# 名称定位
# search_input = driver.find_element(By.NAME, "wd")
# 类名定位
# search_input = driver.find_element(By.CLASS_NAME, "s_ipt")
# XPATH定位(万能,适合复杂场景)
# search_input = driver.find_element(By.XPATH, '//*[@id="kw"]')

# 4. 输入内容并搜索
search_input.send_keys("Python网页自动化")
search_input.send_keys(Keys.ENTER)  # 按回车搜索

# 5. 显式等待(等待搜索结果加载)
wait = WebDriverWait(driver, 15)  # 显式等待15秒(优先级高于隐式)
result_title = wait.until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="1"]/h3/a'))
)

# 6. 点击第一个搜索结果
result_title.click()

# 7. 截图保存(验证操作结果)
driver.save_screenshot("搜索结果页面.png")

# 8. 关闭浏览器
driver.quit()

2. 高频场景:表单自动填写与提交

from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

# 初始化浏览器
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.implicitly_wait(10)
driver.get("https://www.example.com/login")  # 替换为实际表单页面

# 填写用户名和密码
driver.find_element(By.ID, "username").send_keys("test_user")
driver.find_element(By.ID, "password").send_keys("test_pass123")

# 勾选“记住我”复选框
driver.find_element(By.NAME, "remember").click()

# 点击登录按钮
driver.find_element(By.XPATH, '//button[@type="submit"]').click()

# 验证登录成功(检查页面标题)
if "首页" in driver.title:
    print("登录成功!")
else:
    print("登录失败!")

driver.quit()

3. Selenium关键技巧

  • 等待机制必用:避免“元素未加载就操作”导致报错,优先用显式等待(WebDriverWait),精准控制等待条件;
  • 元素定位优先级:ID > 名称 > XPATH/CSS(XPATH万能但效率略低);
  • 处理弹窗:alert弹窗用driver.switch_to.alert.accept()确认,iframe需切换:driver.switch_to.frame("iframe_id")
  • 无头模式:后台运行浏览器(不显示界面),适合批量任务:
    from selenium.webdriver.chrome.options import Options
    chrome_options = Options()
    chrome_options.add_argument("--headless=new")  # 新版无头模式
    driver = webdriver.Chrome(options=chrome_options)
    

三、Playwright实战:新一代网页自动化方案

Playwright是微软推出的新一代工具,内置自动等待、录制功能,语法更简洁,适合现代网页自动化。

1. 核心操作:元素定位与基础操作

from playwright.sync_api import sync_playwright

# 上下文管理器模式(自动关闭浏览器)
with sync_playwright() as p:
    # 1. 启动浏览器(headless=False显示界面)
    browser = p.chromium.launch(headless=False, slow_mo=500)  # slow_mo:慢动作,方便调试
    # 2. 创建页面
    page = browser.new_page()
    # 3. 打开网页(自动等待页面加载完成)
    page.goto("https://www.baidu.com")
    
    # 4. 元素定位与输入(链式调用)
    # 定位搜索框并输入内容
    page.locator("#kw").fill("Python Playwright教程")
    # 按回车搜索(自动等待元素可交互)
    page.locator("#kw").press("Enter")
    
    # 5. 等待搜索结果并点击
    # 等待第一个结果加载并点击
    page.locator('//*[@id="1"]/h3/a').wait_for()
    page.locator('//*[@id="1"]/h3/a').click()
    
    # 6. 截图保存
    page.screenshot(path="playwright搜索结果.png")
    
    # 7. 关闭浏览器
    browser.close()

2. 高频场景:批量网页操作(异步提速)

Playwright支持异步执行,批量操作时速度远超Selenium:

import asyncio
from playwright.async_api import async_playwright

# 异步函数:批量打开网页并获取标题
async def batch_operate():
    async with async_playwright() as p:
        # 启动浏览器
        browser = await p.chromium.launch(headless=True)
        # 批量创建页面
        page1 = await browser.new_page()
        page2 = await browser.new_page()
        page3 = await browser.new_page()
        
        # 并行打开多个网页
        await asyncio.gather(
            page1.goto("https://www.baidu.com"),
            page2.goto("https://www.zhihu.com"),
            page3.goto("https://www.github.com")
        )
        
        # 获取页面标题
        print("百度标题:", await page1.title())
        print("知乎标题:", await page2.title())
        print("GitHub标题:", await page3.title())
        
        await browser.close()

# 执行异步函数
asyncio.run(batch_operate())

3. Playwright杀手锏功能:录制脚本

无需手写代码,Playwright可录制你的操作并自动生成Python脚本:

# 启动录制(目标网址:百度)
playwright codegen https://www.baidu.com
  • 执行命令后会打开浏览器,你的所有操作(点击、输入、跳转)都会被录制;
  • 录制完成后,终端会自动生成对应的Python代码,直接复制即可使用。

4. Playwright关键技巧

  • 自动等待:无需手动写等待逻辑,Playwright会自动等待元素可交互、页面加载完成;
  • 定位器优先级locator()支持ID、XPATH、CSS、文本等,如按文本定位:page.locator("text=登录")
  • 处理多标签页:监听新标签页并切换:
    # 等待新标签页打开
    with page.expect_popup() as popup_info:
        page.locator("a[target='_blank']").click()
    new_page = popup_info.value
    print("新标签页标题:", new_page.title())
    
  • 持久化会话:保存登录状态(免重复登录):
    # 创建持久化上下文(保存cookies)
    context = browser.new_context(storage_state="login_state.json")
    # 登录后保存状态
    context.storage_state(path="login_state.json")
    # 下次直接加载状态
    context = browser.new_context(storage_state="login_state.json")
    

四、Selenium vs Playwright 实战案例:网页数据爬取

1. Selenium爬取百度搜索结果

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")

# 搜索关键词
driver.find_element(By.ID, "kw").send_keys("Python自动化")
driver.find_element(By.ID, "su").click()

# 等待搜索结果加载
wait = WebDriverWait(driver, 15)
results = wait.until(
    EC.presence_of_all_elements_located((By.XPATH, '//div[@class="result-op c-container xpath-log new-pmd"]/h3/a'))
)

# 提取标题和链接
print("Selenium爬取结果:")
for res in results[:5]:  # 取前5条
    print("标题:", res.text)
    print("链接:", res.get_attribute("href"))
    print("-"*50)

driver.quit()

2. Playwright爬取百度搜索结果

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://www.baidu.com")
    
    # 搜索关键词
    page.locator("#kw").fill("Python自动化")
    page.locator("#su").click()
    
    # 提取结果(自动等待元素加载)
    results = page.locator('//div[@class="result-op c-container xpath-log new-pmd"]/h3/a').all()[:5]
    
    print("Playwright爬取结果:")
    for res in results:
        print("标题:", res.inner_text())
        print("链接:", res.get_attribute("href"))
        print("-"*50)
    
    browser.close()

五、常见问题与解决方法

1. Selenium常见问题

  • 驱动版本不匹配
    原因:浏览器版本与驱动版本不一致;
    解决:使用webdriver-manager自动管理驱动(本文示例已用),无需手动下载。
  • 元素定位失败
    原因:元素在iframe中、动态加载、定位表达式错误;
    解决:切换iframe(driver.switch_to.frame())、用显式等待、检查XPATH/CSS表达式。
  • 页面加载超时
    原因:网络慢、页面资源多;
    解决:增加显式等待时间、禁用图片加载(减少资源):
    chrome_options = Options()
    chrome_options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
    

2. Playwright常见问题

  • 异步代码报错
    原因:Python 3.7+需手动启用异步,或嵌套异步;
    解决:确保用asyncio.run()执行异步函数,避免同步/异步混用。
  • 录制脚本运行报错
    原因:录制的定位器在不同环境下失效;
    解决:将录制的定位器改为更通用的(如ID替代文本)。
  • 浏览器启动失败
    原因:未安装浏览器(playwright install);
    解决:重新执行playwright install,或指定浏览器路径。

六、工具选型与进阶技巧

1. 选型原则

  • 兼容老旧系统、多浏览器适配 → 选Selenium;
  • 现代网页、批量自动化、追求速度/稳定性 → 选Playwright;
  • 新手入门 → 优先Playwright(语法简洁、录制功能降低学习成本)。

2. 进阶技巧

  • 反爬规避:模拟真人操作(设置User-Agent、添加随机延迟、避免高频点击);
  • 验证码处理:简单验证码用第三方接口(如超级鹰),复杂验证码需手动介入;
  • 批量任务调度:结合schedule库实现定时自动化:
    import schedule
    import time
    
    def auto_task():
        # 你的自动化代码(如每日9点爬取数据)
        pass
    
    schedule.every().day.at("09:00").do(auto_task)
    while True:
        schedule.run_pending()
        time.sleep(1)
    

总结

关键点回顾

  1. Selenium是老牌网页自动化工具,兼容性强,需手动处理等待,适合老旧系统/多浏览器场景;
  2. Playwright是新一代工具,内置自动等待、录制功能,语法简洁、速度快,适合现代网页/批量自动化;
  3. 核心操作逻辑一致:打开浏览器→定位元素→操作元素→验证结果,差异在于等待机制和语法;
  4. 新手优先学Playwright(降低调试成本),需兼容老旧系统再补充Selenium知识。

网页自动化的核心是“模拟真人操作+精准等待”,避免过于机械的操作触发反爬/风控。入门时先复现本文的基础案例,再结合实际场景(如表单填写、数据爬取、批量操作)逐步拓展,重点掌握元素定位和等待机制两大核心技能。

posted @ 2025-12-27 10:43  卤蛋一枚  阅读(0)  评论(0)    收藏  举报