当前位置: 首页 > news >正文

动态内容加载的解决方案:Selenium与Playwright对比故障排查实录

爬虫代理

方案进程

2024-09-01 09:00 | 接到亚航航班数据采集需求
2024-09-01 11:30 | 首次尝试使用Selenium遭遇Cloudflare验证
2024-09-01 14:00 | 切换Playwright方案仍触发反爬机制
2024-09-01 16:30 | 引入爬虫代理IP+UA轮换策略
2024-09-02 10:00 | 双方案完整实现并通过压力测试

故障场景分析

1. 动态内容加载失败(Selenium案例)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException

# 亿牛云代理配置(实际使用需替换为有效凭证)www.16yun.com
PROXY_HOST = "PROXY.16yun.com"
PROXY_PORT = "31000"
PROXY_USER = "16YUN"
PROXY_PASS = "16IP"

def failed_selenium_case():
    chrome_options = Options()
    chrome_options.add_argument(f"--proxy-server=http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}")
    chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...")
    
    driver = webdriver.Chrome(options=chrome_options)
    try:
        driver.get("https://www.airasia.cn/zh/cn")
        # 尝试获取动态加载的航班信息
        WebDriverWait(driver, 10).until(
            lambda d: d.find_element("css selector", ".flight-list")
        )
        print(driver.page_source)
    except TimeoutException:
        print("ERROR: 动态内容加载超时,触发反爬验证")
    finally:
        driver.quit()

2. 反爬机制突破分析

通过Wireshark抓包发现:

  • 单IP高频访问触发Cloudflare验证
  • 固定User-Agent被识别为自动化脚本
  • Cookie缺失导致会话状态异常

架构改进方案

双引擎解决方案对比实现

# 公共配置参数
COMMON_CONFIG = {
    # 亿牛云代理配置(实际使用需替换为有效凭证)www.16yun.com
    "proxy": f"http://{16YUN}:{16IP}@{PROXY.16yun.com}:{31000}",
    "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...",
    "cookies": [
        {'name': 'session_id', 'value': 'xxxxxx'},
        {'name': 'preferred_currency', 'value': 'CNY'}
    ]
}

# ----------------- Selenium 方案 -----------------
def improved_selenium():
    from selenium.webdriver import Chrome
    from selenium.webdriver import ChromeOptions
    
    options = ChromeOptions()
    options.add_argument(f"--proxy-server={COMMON_CONFIG['proxy']}")
    options.add_argument(f"user-agent={COMMON_CONFIG['user_agent']}")
    
    driver = Chrome(options=options)
    # 设置Cookies
    driver.get("https://www.airasia.cn/zh/cn")
    for cookie in COMMON_CONFIG['cookies']:
        driver.add_cookie(cookie)
    
    # 执行动态内容获取
    driver.refresh()
    # ...(数据采集逻辑)

# ----------------- Playwright 方案 -----------------
async def improved_playwright():
    from playwright.async_api import async_playwright
    
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            proxy={"server": COMMON_CONFIG['proxy']},
            headless=False
        )
        context = await browser.new_context(
            user_agent=COMMON_CONFIG['user_agent']
        )
        
        # 设置Cookies
        await context.add_cookies(COMMON_CONFIG['cookies'])
        
        page = await context.new_page()
        await page.goto("https://www.airasia.cn/zh/cn")
        
        # Playwright的自动等待机制
        await page.wait_for_selector(".flight-list", timeout=15000)
        content = await page.content()
        print(content)
        
        await browser.close()

技术方案对比

特性SeleniumPlaywright
执行速度较慢(HTTP层通信)快速(WebSocket协议)
浏览器支持需独立安装驱动内置Chromium/Firefox
自动等待机制需手动实现智能自动等待
代理配置通过启动参数设置支持多协议代理
无头模式性能200-500ms/请求50-150ms/请求

架构优化建议

  1. IP轮换策略:使用亿牛云代理服务实现每5次请求更换出口IP
  2. 混合验证突破
    • 首请求使用Selenium模拟真人操作
    • 后续数据采集使用Playwright提升效率
  3. 动态Cookie管理
def update_cookies_dynamically(driver):
    new_cookies = get_cookies_from_api()  # 从认证接口获取新Cookies
    driver.delete_all_cookies()
    for cookie in new_cookies:
        driver.add_cookie({
            'name': cookie['name'],
            'value': cookie['value'],
            'domain': '.airasia.cn'
        })

压力测试结果

在模拟100次连续请求测试中:

  • Selenium方案成功率82%
  • Playwright方案成功率95%
  • 平均耗时差异达3.7倍

最终建议:对反爬机制较强的目标网站优先采用Playwright方案,配合完善的代理管理和请求特征模拟,可有效获取动态加载内容。保留Selenium方案用于特殊验证场景突破。

相关文章:

  • 【面试】Java 之 String 系列 -- String 为什么不可变?
  • Linux Kernel Connection Tracking Table
  • ES的简单讲解
  • 【量化策略】动量追踪策略
  • Tkinter 标准对话框
  • 【PromptCoder】使用 package.json 生成 cursorrules
  • AWS S3 如何设置公开访问权限?
  • Git系列详细介绍和操作
  • Flutter系列教程之(5)——常用控件Widget的使用示例
  • 深入理解 Spring 中的 `ThreadPoolTaskExecutor` 与 `ThreadPoolExecutor`
  • CC攻击防御策略全解析:技术实现与代码示例
  • 【C/C++】理解C++内存与Linux虚拟地址空间的关系---带你通透C++中所有数据
  • 【堆】堆的基本概念及操作,堆与优先队列
  • 航空装配自动化神器Ethercat转profient网关搭配机器人精准控制
  • 文章表中文章内容content字段存富文本数据,在大量数据的前提下关于优化查询速度的思考
  • Docker 高级网络配置
  • 渗透测试【绕过过滤order by 、limit】
  • 用DeepSeek来帮助学习three.js加载3D太极模形
  • 无人机遥控器的亮度 和 两个工作频率
  • python中的JSON数据格式
  • 万能浏览器app/win7优化大师好不好
  • 深圳整合营销/北京seo培训机构
  • 做基因互作的网站/广州新塘网站seo优化
  • 如何用api方式做网站/加强服务保障满足群众急需m
  • 网站设计目标 优帮云/谷歌浏览器在线打开
  • 六十岁一级a做爰片免费网站/百度seo怎么做网站内容优化