前言
传统 HTTP 库(Requests + BeautifulSoup)只能拿到原始 HTML,面对 React/Vue.js/Angular 的 CSR(Client Side Rendering,前端渲染)页面毫无办法。
需要真实浏览器环境的场景,Playwright 在 API 设计、等待机制、多浏览器支持上全面优于 Selenium;
大规模采集且不愿自建反爬基础设施的,走 Scraper API 云端渲染或者使用蜻蜓代理提供的代理 IP 服务。
我们的建议:抓取 JS 渲染内容,首选 Playwright。
1. 技术选型
requests.get() 这类旧方案的问题在于:拿到的 HTML 里没有 JS 执行后的 DOM 节点。异步加载的数据也丢失。
建议:
使用 Selenium 或 Playwright 驱动无头浏览器,完整渲染页面后再提取数据。
Playwright 原生支持 auto-waiting、网络拦截、多 tab 上下文,API 更现代;
Selenium 生态更老,资源更多但配置更繁琐。
2. 核心代码与关键点
Selenium 模拟无限滚动:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
- 触发页面底部的懒加载逻辑,需配合显式等待判断新内容是否加载完毕,不要用
time.sleep()硬等。
Playwright 动态等待 + 分页:
page.wait_for_selector('.product-card')
if page.query_selector('text=Next'):
page.click('text=Next')
wait_for_selector基于浏览器事件循环触发,比 Selenium 的 WebDriverWait 更可靠。- 分页点击前先检测元素是否存在,避免抛异常中断采集流程。
3. 注意事项
- 显式等待替代强制睡眠:用
wait_for_selector/wait_for_load_state等待条件满足,不要time.sleep(5)。硬编码等待时间是性能浪费和采集不稳定的根源。 - WebDriver 版本匹配:Selenium + ChromeDriver 必须保证版本与本地 Chrome 完全一致,版本不匹配会导致 session 创建失败。Playwright 自带 Chromium,不存在此问题。
- IP 封禁与代理轮换:自建方案必须集成代理池,单 IP 高频请求会在几分钟内被封。有使用代理IP池需求的朋友,可以试试看我们的服务, 《蜻蜓代理接入文档》
- CAPTCHA 降级策略:监控验证码触发率,超过阈值时降低请求频率,不要硬闯。
- 模拟真实行为:滚动间隔加随机抖动,鼠标轨迹模拟自然移动,请求间隔服从正态分布而非固定值。
4. 进阶
- 异步并发采集:Playwright 原生支持
async/await,配合asyncio可在单个浏览器实例内并发打开多个页面,吞吐量比串行提升 5-10 倍。核心是用async with asyncio.Semaphore(n)控制并发上限,避免内存溢出。 - 浏览器指纹伪装:使用
playwright-stealth或手动注入脚本修改navigator.webdriver、navigator.plugins、Canvas/WebGL 指纹。高端反爬系统(如 Cloudflare、DataDome)会交叉校验这些特征。 - 请求拦截与资源过滤:在 Playwright 中用
page.route('**/*.{png,jpg,woff,css}', lambda route: route.abort())拦截非必要资源加载,页面渲染速度提升 40%+,内存占用显著下降。
5. 国内落地建议
合规红线:
国内《数据安全法》和《个人信息保护法》对爬虫抓取的合规要求严格。采集前确认目标站点的 robots.txt 和服务条款,涉及用户个人信息(手机号、身份证、地址)的数据坚决不碰。
转载请注明
- 蜻蜓代理 - Python 动态网页抓取指南
- 头条号 - 蜻蜓软件
- 微信公众号:蜻蜓软件(qingtingsoft)

