Ben Ben Blog.

網絡爬蟲 - Puppeteer減少不必要的api call

前言

上一篇文章說到我用了Cloudflare workers來建立自己的proxy list。他提供每天100,000call/day。我一開始有估算過,一場比賽大約有200-300人參加,每5分鐘爬一次網站,最差的情況也就300人 * 288個5分鐘 = 86,400。但是事實並沒這麼簡單。

螢幕截圖 2024-12-27 下午11.23.24.png

問題發生在哪?

在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();
        }
      });

完成

這樣我們就可以繼續做免費仔了!!!

文檔

https://pptr.dev/guides/network-interception