Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
在解決問題之道上不斷前行
免費仔萬歲!(誤)puppeteer是一個nodeJS的函式庫,可以用來控制 Chrome 或 Chromium 瀏覽器,當然是一個用作爬蟲的好工具。這邊就先跳過puppeteer的使用方式介紹,僅記錄在Vercel上使用puppeteer進行網頁爬蟲遇到的一些問題。
使用puppeteer可以參考這邊
由於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
如果搭配排程服務,就可以透過免費服務製作一個自動爬蟲工具,免費仔萬歲!