【Python】Playwright:高效页面交互实战指南
1. Playwright入门为什么选择它做页面交互第一次接触Playwright是在去年一个电商爬虫项目里当时被它惊艳的加载速度折服。相比传统的SeleniumPlaywright最让我惊喜的是它能自动等待页面完全加载完成再也不用写一堆sleep和retry逻辑了。举个例子我们团队之前用Selenium抓取某电商平台数据时平均每个页面要设置3-5秒的等待时间而切换到Playwright后配合wait_for_selector方法整体效率提升了40%以上。安装Playwright简单到令人发指一条命令就能搞定pip install playwright playwright install这里有个小坑要注意安装浏览器驱动时可能会被墙建议配置国内镜像源。我常用清华源速度稳定PLAYWRIGHT_DOWNLOAD_HOSThttps://npmmirror.com/mirrors/playwright playwright install2. 页面导航的实战技巧2.1 goto()方法的隐藏玩法大多数人只知道page.goto()能打开网页但它的超时控制才是精髓。上周我调试一个政府网站时发现默认的30秒超时经常不够用特别是当网站有大量第三方资源时。这时候就需要调整参数page.goto(https://gov-example.com, timeout120000, wait_untilnetworkidle)实测下来wait_until参数有这几个选项最实用domcontentloadedDOM加载完就继续适合SPA应用load等所有资源加载完传统网页适用networkidle网络空闲时继续防ajax干扰2.2 伪装浏览器指纹有些反爬严格的网站会检测浏览器指纹。通过context.new_page()创建页面时可以定制UA和视窗尺寸context browser.new_context( user_agentMozilla/5.0 (Macintosh), viewport{width: 1920, height: 1080} )最近帮朋友做招聘网站爬虫时加上这些参数后被ban的概率直接从70%降到5%以下。3. 元素等待的进阶策略3.1 智能等待元素wait_for_selector()有个骚操作很多人不知道——可以等元素消失做表单提交时特别有用# 等加载动画消失再继续 page.wait_for_selector(.loading, statehidden)最近做的一个金融项目里这种写法比固定等待节省了平均2.3秒/页面的时间。表格对比下几种等待方式方法平均耗时可靠性time.sleep(5)5s❌wait_for_selector1.2s✅wait_for_function0.8s✅✅3.2 自定义等待条件更复杂的场景可以用wait_for_function比如等Vue组件渲染完成page.wait_for_function( () window.__VUE_APP_LOADED__ )这个技巧帮我解决了某CMS后台的自动化测试难题之前用Selenium死活搞不定Vue的加载检测。4. 截图与录屏的黑科技4.1 精准区域截图除了全屏截图Playwright还能截取特定区域。做UI对比测试时这个功能太香了page.screenshot( pathpopup.png, clip{x: 100, y: 100, width: 300, height: 200} )上个月用这个方法自动检测了200多个页面的广告位展示效率比人工检查高出一个数量级。4.2 录制操作视频90%的人不知道Playwright能录屏调试复杂操作时简直是神器context browser.new_context(record_video_dirvideos/) page context.new_page() # ...执行操作... context.close() # 自动保存视频注意视频默认只保存最后操作部分要完整记录需要配置context browser.new_context( record_video_dirvideos/, record_video_size{width: 1280, height: 720} )5. 表单填写的实战经验5.1 复杂表单处理遇到动态生成的表单字段时locator比直接selector更可靠page.locator(form).get_by_label(用户名).fill(test) page.locator(form).get_by_role(button).click()最近用这套写法成功突破了某SAAS平台的反爬关键是要结合page.locator(input).filter(has_text手机号)5.2 文件上传的坑文件上传是常见痛点Playwright的set_input_files比Selenium优雅太多page.get_by_label(上传头像).set_input_files(avatar.png)处理隐藏的input元素时有个技巧page.locator(input[typefile]).evaluate(el el.style.displayblock) page.locator(input[typefile]).set_input_files(file.pdf)6. 浏览器上下文的高级用法6.1 多账号隔离做电商爬虫时经常需要多账号并行context是完美解决方案async with async_playwright() as p: browser await p.chromium.launch() # 买家账号 buyer_context await browser.new_context() buyer_page await buyer_context.new_page() # 卖家账号 seller_context await browser.new_context() seller_page await seller_context.new_page()6.2 登录状态持久化storage_state比直接操作cookies方便10倍# 保存状态 context.storage_state(pathuser1.json) # 恢复登录 context await browser.new_context( storage_stateuser1.json )最近用这个技术实现了某社交平台的自动签到稳定运行3个月没掉线。7. 性能优化实战7.1 请求拦截技巧拦截不必要的资源能大幅提升速度async def route_handler(route): if ads in route.request.url: await route.abort() else: await route.continue_() await page.route(**/*, route_handler)在某新闻网站项目里这个优化让页面加载时间从6s降到1.8s。7.2 设备模拟妙用用设备预设能绕过一些移动端检测iphone playwright.devices[iPhone 12] context await browser.new_context(**iphone)实测某外卖平台用这招成功率提升60%关键是要配合触摸事件await page.tap(button#submit)8. 调试技巧与常见问题8.1 慢动作模式调试时加上slow_mo参数操作会变慢但更清晰browser await p.chromium.launch(headlessFalse, slow_mo100)8.2 元素定位神器Playwright Inspector比浏览器开发者工具更好用PWDEBUG1 python script.py运行后会自动打开调试器可以实时查看执行步骤生成定位代码回放操作过程最近帮团队新人排查问题时用这个工具把平均解决时间从2小时缩短到15分钟。