前言

传统 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.webdrivernavigator.plugins、Canvas/WebGL 指纹。高端反爬系统(如 Cloudflare、DataDome)会交叉校验这些特征。
  • 请求拦截与资源过滤:在 Playwright 中用 page.route('**/*.{png,jpg,woff,css}', lambda route: route.abort()) 拦截非必要资源加载,页面渲染速度提升 40%+,内存占用显著下降。


5. 国内落地建议

合规红线:

国内《数据安全法》和《个人信息保护法》对爬虫抓取的合规要求严格。采集前确认目标站点的 robots.txt 和服务条款,涉及用户个人信息(手机号、身份证、地址)的数据坚决不碰。

转载请注明