網絡爬蟲 - Puppeteer減少不必要的api call
前言
上一篇文章說到我用了Cloudflare workers來建立自己的proxy list。他提供每天100,000call/day。我一開始有估算過,一場比賽大約有200-300人參加,每5分鐘爬一次網站,最差的情況也就300人 * 288個5分鐘 = 86,400。但是事實並沒這麼簡單。
問題發生在哪?
在Cloudflare workers上面,我們可以看到不同worker的log,很多除了目標網站以外的東西,因為puppeteer會模擬browser的行為,會fetch很多東西,例如網頁的.ico, .css 和 .js 等等用來渲染網頁的東西,以至我的免費plan 100,000 call 在幾小時就花光光了。
我需要的東西是什麼?
在這個項目上,我只需要分數,而html則已經足夠了(還好他不是 client side rendering),其他的.css, .ico我完全不需要。
解決方法
puppeteer 是一個為爬蟲而設計的工具,當然是有在這方面考慮到。 他提供了on request 的callback hook,然後你可以在發送執行一些任務,或是決定要中斷還是繼續。
首先,我們要在browser.newPage()後設定這個page是可以intercept的。
await page.setRequestInterception(true);
之後,我們就可以加入request interceptor,當request的時候,把符合條件裡的request都abort掉,否則就繼續,很簡單的logic。
page.on("request", (req) => {
if (
req.resourceType() == "stylesheet" ||
req.resourceType() == "font" ||
req.resourceType() == "image" ||
req.url().endsWith(".js") ||
req.url().endsWith(".ico")
) {
req.abort();
} else {
req.continue();
}
});
完成
這樣我們就可以繼續做免費仔了!!!