Playwright 爬虫为什么越开越慢?你得先看清它的真实带宽形态(瞬时爆发)

49 阅读4分钟

很多人优化 Playwright 爬虫,第一反应是:

  • 开更多进程

  • 上 PM2 cluster

  • 调线程、调并发

结果往往是:越开越慢、越开越抖、超时越来越多

如果你也遇到过这种情况,我建议你先别改代码,先做一件事:

把带宽看清楚。****

因为 Playwright 的流量不是“持续型”,而是瞬时爆发型(burst)

而 burst,才是你爬虫抖动、超时、并发变慢的根源。


1. Playwright 的流量为什么是“瞬时爆发型”?

Playwright 的核心动作是 page.goto(url)。

但它不是“请求一个页面”这么简单,而是触发浏览器加载一整个网页生态:

  • HTML

  • CSS / JS

  • 图片 / 字体 / icon

  • 接口请求(XHR / fetch)

  • 统计脚本 / 埋点 / 广告

  • iframe / 子资源 / CDN

这些资源会在很短的时间里并发发起请求,所以带宽呈现出的形态往往是:

0 → 瞬间拉满 → 降下来 → 再瞬间拉满****

它更像“秒杀抢购”式的爆发,而不是稳定下载。


2. 为什么 burst 会让爬虫变慢、变不稳定?

你真正遇到的问题通常不是“代码慢”,而是 burst 带来的系统级问题。

2.1 带宽瞬间触顶,导致请求排队

当 burst 把带宽打满时,所有连接都会变慢:

  • 关键接口响应变慢

  • 页面资源加载变慢

  • goto 时间被拉长

  • 更容易触发 timeout

2.2 多实例 burst 叠加,直接变成抖动(jitter)

你开一个 Playwright 还好。

你开多个 Playwright,它们会同时 burst:

  • 多个 Chromium 抢带宽

  • 多个请求高峰叠在一起

  • 系统出现明显抖动

结果就是:

  • 爬虫吞吐反而下降

  • 超时和失败率上升

  • 稳定性变差

2.3 “不重要的资源”抢走了带宽

很多站点的图片、字体、统计脚本会非常重。

一旦它们占掉带宽,你真正需要的数据接口反而慢了。

所以优化 Playwright 的第一步,不是开更多进程,而是:

找出谁在抢你的带宽。****


3. 实时看带宽总趋势:nload

如果你想先确认:带宽是不是触顶了,用 nload 就够了。

安装并运行:

sudo apt install -y nload
nload

你在 nload 里重点看两件事:

  • 带宽是否长期接近上限(例如 4M、10M、100M)

  • 每次 goto 是否都会出现明显尖峰

如果你看到:

  • 一打开 Playwright,流量就经常拉满

  • 并发越高,尖峰越密集

那么可以直接下结论:

你的瓶颈不是 CPU,也不是 Node,而是带宽。


4. 看 burst + 找出“谁在抢带宽”:iftop(更适合 Playwright)

nload 只能告诉你“带宽有没有满”。

但它解决不了一个关键问题:

到底是谁把带宽抢走了?****

这时候就需要 iftop。

安装并运行(以 eth0 为例):

sudo apt install -y iftop
sudo iftop -i eth0

你会看到每一个连接的实时带宽占用,以及 1s / 10s / 40s 的平均值。

这对 Playwright 特别有用,因为 Playwright 的流量是 burst:

  • 你能看到每次 burst 的峰值

  • 你能看到哪个 host 在短时间里抢占了大部分带宽

  • 你能看到多实例并发时 burst 是否叠加

在 iftop 里,你重点看这几类连接:

  • 图片域名(img / static / cdn)

  • 字体域名(fonts / fontcdn)

  • analytics / tracking

  • 视频 / 广告相关资源

很多时候你会发现:

真正抢走带宽的根本不是你要的数据接口,而是这些“无关资源”。


5. 找到“抢带宽的资源”之后,怎么优化?

Playwright 性能优化最值钱的一步就是:

最大限度削减网络负载。****

最常见、最有效、最应该做的优化是:

直接 abort 掉图片 / 字体 / 视频资源。

await page.route("**/*", (route) => {
  const type = route.request().resourceType();
  if (["image", "media", "font"].includes(type)) {
    return route.abort();
  }
  route.continue();
});

这段代码的价值非常直接:

  • 页面请求量明显下降
  • 带宽峰值下降
  • burst 抖动减少
  • goto 速度提升
  • 超时和失败率下降
  • 并发更稳定

6. 用 nload + iftop 验证优化是否有效

优化 Playwright,最怕的是“感觉快了”,但其实只是偶然。

正确的验证方式是:

6.1 优化前

  • 用 nload 看是否触顶

  • 用 iftop 看 burst 峰值是谁造成的

6.2 加 abort 后

  • nload 的尖峰明显变小

  • iftop 里大流量连接减少

  • 关键接口连接占比上升

6.3 再看结果

  • timeout 是否下降
  • 失败率是否下降
  • 并发是否更稳

END:nload 让你看到“是否触顶”,iftop 让你看到“谁在抢”

如果你的 Playwright 爬虫:

  • 越开越慢

  • 并发一高就抖

  • 经常 timeout

  • CPU 并不高

不要第一时间怀疑代码和框架。

先把带宽看清楚。

nload 负责告诉你:带宽是否触顶

iftop 负责告诉你:是谁把带宽抢走

Playwright 的性能优化,首先是网络优化,其次才是并发策略。