大多数 Playwright 教程教你抓取单个页面。真正的抓取器需要抓取成千上万个页面。杀死你的不是选择器——而是 Playwright 在它触及选择器之前所做的一切操作。
默认情况下,Playwright 会像人类访问网站一样加载页面。它会下载 CSS、字体、分析脚本、A/B 测试像素、主视觉图片、懒加载轮播图和三种不同的聊天小部件。在一个产品目录页面上,这些都是你不需要的 4-6 MB 的内容。乘以 10,000 个页面,这就是 20 分钟运行和 3 小时运行之间的区别。
这是我放入每个角色的 10 行路由处理程序:
const BLOCKED = ['image', 'media', 'font', 'stylesheet'];
await context.route('**/*', (route) => {
const type = route.request().resourceType();
const url = route.request().url();
if (BLOCKED.includes(type)) return route.abort();
if (/google-analytics|doubleclick|hotjar|segment|gtm/.test(url)) {
return route.abort();
}
route.continue();
});
就这样。两个列表:你不需要的资源类型,以及你绝对不需要的跟踪域.
在你发布前要检查的3项清单
-
测试你的数据是否还在. 有些网站懒加载产品信息到图片中
data-属性。中止图片有时会中断提取。带和不带路由处理器的命令行运行并比较输出结果。 - 不要阻塞脚本。 现代网站使用JS构建DOM。中止脚本会得到一个空页面。(CSS和字体是安全的——Playwright不需要它们来定位选择器。)
- 注意那些检测到这种情况的网站。 一些反机器人脚本会检查你是否获取了分析像素。如果启用这个功能后你的成功率下降,允许分析域名再次通过。
快速案例
在我们的Sephora产品信息展示器上,这一项改动将平均页面加载时间从4.8秒缩短到1.3秒。在处理一个包含5000个产品的目录抓取时,这就是从6.5小时减少到1.8小时的区别。使用相同的CSS选择器、相同的数据、相同的成功率。我们只是停止了下载那些我们从不查看的保湿产品的英雄图片。
它还使我们的Apify每次运行的计算单元减少了约60%,这直接影响我们向客户收取的费用。速度更快,成本更低,输出相同。路由处理程序现在随附丝芙兰产品信息行为者,以及之后的每个新抓取器。
你没有要求号召性用语
这个路由处理器随我们的启动演员模板一起提供。新的爬虫第一天就能获得它。旧的爬虫在我们第一次注意到运行时时就被安装了。>1小时。
该模式适用于任何基于浏览器的抓取器——Playwright、Puppeteer、带有 CDP 的 Selenium。其形态始终是:告诉浏览器什么不在加载之前,告诉它要寻找什么。
对那些重度依赖 JS 的朋友们说一句:同样的模式适用于 Puppeteer 的 page.setRequestInterception(true) — 同样的思路,API 略有不同。效果一样好。
把你最慢的爬虫的运行时间发在评论区。 我猜猜是什么在消耗你的分钟。 (提示:很可能是英雄图片。)
同意,不同意,或者有一个网站,阻止图片会导致某些微妙的问题?回复一下。
由**Nova Chen撰写,SIÁN Agency的自动化开发倡导者。在dev.to上了解更多关于Nova的信息。如需定制抓取或自动化工作,请雇佣SIÁN Agency。
























