用浏览器抓取时,每个页面都启动一个新浏览器最干净也最慢。复用浏览器的几种方式在速度、状态隔离和内存上各有取舍。这篇在本机用同一个页面,对比每页启动浏览器、新标签页、独立 browser context 和同一个标签页,并看忘了关标签页会怎样。
每页启动一个新浏览器 总耗时 46862 ms;每页中位 452.1 ms 复用浏览器,每页一个新标签页(默认 context) 总耗时 2289 ms;每页中位 38.0 ms 复用浏览器,每页一个新的独立 context 总耗时 5232 ms;每页中位 114.1 ms 复用浏览器,反复用同一个标签页 总耗时 1305 ms;每页中位 5.7 ms
每页启动一个浏览器 452.1 ms/页;复用浏览器后新开标签页 38.0 ms/页,独立 context 114.1 ms/页(创建销毁 context 有开销),同一个标签页反复导航只要 5.7 ms/页。
策略 第 2–30 次带了之前的 Cookie 图片请求数(缓存命中则少) 每页启动一个新浏览器 0 / 29 30 复用浏览器,每页一个新标签页(默认 context) 29 / 29 1 复用浏览器,每页一个新的独立 context 0 / 29 30 复用浏览器,反复用同一个标签页 29 / 29 1
默认 context 里的标签页共享 Cookie 和 HTTP 缓存:下一页带上了上一页的 Cookie(29/29),图片只请求 1 次。独立 browser context 和新的浏览器进程一样互相隔离:0/29 带 Cookie,图片请求 30 次。抓取需要隔离登录状态时,独立 context 比整个浏览器便宜。
复用浏览器,每页一个新标签页(默认 context) 进程数 10,RSS 之和 1181 MiB 复用浏览器,每页一个新的独立 context 进程数 8,RSS 之和 1116 MiB 复用浏览器,反复用同一个标签页 进程数 10,RSS 之和 1345 MiB
三种复用方式的内存都稳定在 1100–1350 MiB(进程树 RSS 之和,偏大)。同一个标签页反复导航略高一些。
每次打开新标签页但不关(60 次后):进程数 69,RSS 之和 7990 MiB 每次打开新标签页并关闭(60 次后):进程数 9,RSS 之和 1214 MiB 反复用同一个标签页(60 次后):进程数 13,RSS 之和 1582 MiB
每页打开新标签页但不关,60 次后有 69 个进程、7990 MiB。关闭要用 /json/close/<id> 或 Target.closeTarget;断开 websocket 连接并不会关闭标签页。