Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

在Vercel上使用puppeteer製作爬蟲

內容目錄

在Vercel上使用puppeteer製作爬蟲

免費仔萬歲!(誤)puppeteer是一個nodeJS的函式庫,可以用來控制 Chrome 或 Chromium 瀏覽器,當然是一個用作爬蟲的好工具。這邊就先跳過puppeteer的使用方式介紹,僅記錄在Vercel上使用puppeteer進行網頁爬蟲遇到的一些問題。
使用puppeteer可以參考這邊

使用puppeteer-core

由於Vercel上不能直接執行Chromium ,需要透過chrome-aws-lambda來使用Chromium,必須注意chrome-aws-lambda不能執行本機的Chromium,如果要本機測試則需將executablePath改為實體的位置喔。範例大致如下

import puppeteer from 'puppeteer-core'

const getData = async (url) => {
    try {
        let browser = await puppeteer.launch({
            args: [...chrome.args, '--hide-scrollbars', '--disable-web-security'],
            defaultViewport: chrome.defaultViewport,
            executablePath: await chrome.executablePath,
            headless: chrome.headless,
            ignoreHTTPSErrors: true,
        });
        const browser = await puppeteer.launch(options);
        const page = await browser.newPage();
        await page.goto('前往的網頁', { waitUntil: 'networkidle0' });
        await page.close();
        await browser.close();
  } catch (err) {
      console.error(err);
      return;
  }
}

輕量化爬蟲

如果只是要爬取文字資料,那可以關閉圖片、css等請求,將爬蟲輕量化以壓低執行時間。

//需要先設定 setRequestInterception 為 true,預設狀況下request 是唯讀的。
await page.setRequestInterception(true);
page.on("request", (req) => {
  if (
    req.resourceType() == "stylesheet" ||
    req.resourceType() == "font" ||
    req.resourceType() == "image"
  ) {
    req.abort();
  } else {
    req.continue();
  }
});

限制

由於Vercel上有部署的套件大小限制50mb,puppeteer-core和chrome-aws-lambda需要使用以下版本,用最新版會超過限制導致無法部署。
Vercel上也需要使用Node14版本,記得調整唷。
packeage.json

  "puppeteer-core": "10.1.0",
  "chrome-aws-lambda": "10.1.0",

按照上述應該就能部署成功,並且爬取一個網頁內容,在我的專案中爬複數網頁就會超過執行時間而失敗,這邊還是研究如何改進執行效率XD
如果搭配排程服務,就可以透過免費服務製作一個自動爬蟲工具,免費仔萬歲!