1. Playwright爬虫的核心优势

第一次接触Playwright时,我被它的执行速度震惊了。相比之前用过的Selenium,同样的电商网站抓取任务,Playwright的完成时间缩短了近60%。这主要得益于它直接通过WebSocket协议与浏览器通信,而Selenium需要通过HTTP接口中转。

Playwright最让我惊喜的是它的自动等待机制。以前用Selenium时,总要写一堆WebDriverWait,现在只需要page.click(),它会自动等待元素可点击状态。有次抓取一个加载特别慢的旅游网站,我特意对比了两种方案的稳定性 - Playwright的成功率高达98%,而Selenium只有85%。

跨浏览器支持是另一个杀手锏。上周有个客户需要测试在Safari上的兼容性,用Playwright只需要改一行代码:

browser = p.webkit.launch()  # 切换到WebKit内核

而如果用Selenium,还得单独配置Safari驱动。

2. 突破反爬的五大实战策略

2.1 网络请求拦截技巧

在抓取某奢侈品网站时,我发现他们通过图片懒加载延迟显示价格。通过拦截图片请求,爬取速度提升了3倍:

page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())

更高级的用法是修改请求头。有次遇到Cloudflare验证,我通过注入常见浏览器的headers成功绕过:

page.set_extra_http_headers({
    "Accept-Language": "en-US,en;q=0.9",
    "Sec-Ch-Ua": '"Chromium";v="122"'
})

2.2 智能等待的三种模式

对于动态加载的内容,我总结出最佳实践组合:

  1. wait_for_selector:等待特定元素出现
  2. wait_for_function:等待JS执行完成
  3. wait_for_timeout:最后兜底方案

比如抓取社交媒体动态:

page.wait_for_selector(".feed-item", state="attached")  # 先等容器
page.wait_for_function("window._feedLoaded")  # 再等数据

2.3 浏览器指纹伪装

最近很多网站开始检测自动化特征。通过以下配置可以显著降低识别率:

context = browser.new_context(
    user_agent="Mozilla/5.0 (Windows NT 10.0)...",
    locale="zh-CN",
    timezone_id="Asia/Shanghai",
    permissions=["geolocation"]
)

2.4 鼠标轨迹模拟

对于有行为检测的网站,我开发了随机移动函数:

def random_move(page, element):
    for i in range(10):
        x = random.randint(0, 100)
        y = random.randint(0, 100)
        page.mouse.move(element.x + x, element.y + y)
        page.wait_for_timeout(200)

2.5 多账号轮换策略

管理多个账号会话很简单:

# 保存状态
context.storage_state(path="user1.json")
# 恢复状态
context = browser.new_context(storage_state="user1.json")

3. 电商数据抓取完整案例

最近完成的一个跨境电商项目很典型。目标网站有这些防护:

  • 价格信息需要悬停显示
  • 分页是AJAX加载
  • 有行为异常检测

完整解决方案:

async def scrape_products():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        context = await browser.new_context(
            viewport={"width": 1920, "height": 1080},
            user_agent=random.choice(USER_AGENTS)
        )
        
        page = await context.new_page()
        await page.goto("https://target.com/products")
        
        # 关键步骤
        await handle_cookie_popup(page)
        await simulate_scrolling(page)
        products = await extract_data(page)
        
        await browser.close()
        return products

其中handle_cookie_popupsimulate_scrolling是封装的通用函数。这个方案连续运行2周未被封禁。

4. 常见问题解决方案

元素定位失败是最常见的问题。我的排查流程:

  1. 先用page.content()查看当前DOM
  2. 检查iframe嵌套
  3. 尝试XPath和CSS选择器交替使用

验证码处理的三种方案:

  1. 人工识别后注入cookies
  2. 使用商业打码服务API
  3. 通过page.solve_recaptcha()自动处理

对于性能优化,建议:

  • 复用浏览器实例
  • 并行处理时每个线程独立context
  • 禁用不必要的资源加载

5. 进阶技巧与最佳实践

调试技巧

# 启动调试模式
page.pause()  # 或设置headless=False

# 监听网络请求
page.on("request", lambda req: print(req.url))

移动端适配示例:

iphone = p.devices["iPhone 13"]
context = await browser.new_context(**iphone)

无头模式优化配置:

browser = await p.chromium.launch(
    headless=True,
    args=[
        "--disable-gpu",
        "--single-process",
        "--no-zygote"
    ]
)

在实际项目中,我建议将这些策略组合使用。比如先通过网络拦截减少流量消耗,再配合智能等待确保稳定性,最后用行为模拟降低封禁风险。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐