在 GCP 上使用 Puppeteer 執行爬蟲作業

這篇算是寫給自己看的紀錄,雖然 nodeJS 應該不會是製作爬蟲的首選,不過做一些簡單的小工具就不用太講究了。
這篇的重點是在沒有安裝 chrome 瀏覽器的 vm 上執行使用 Chromium 的 Puppeteer,所以開機器跟寫爬蟲的部份就會簡單跳過。

爬蟲準備

雖然不是重點,但還是得先要有爬蟲的程式才能繼續下去,這次爬蟲的受害者依舊是中央氣象局,我們簡單的用爬蟲去取得今天台北市的天氣狀況,程式如下:(再次提醒,爬蟲會造成對方伺服器負擔,請勿頻繁的擷取資料)

取得這塊跑馬燈的文字內容取得這塊跑馬燈的文字內容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const puppeteer = require("puppeteer");
const cheerio = require("cheerio");

enterPage("https://www.cwb.gov.tw/V8/C/W/County/County.html?CID=63");

async function enterPage(url) {
const browser = await puppeteer.launch({ args: ["--no-sandbox"] });
const page = await browser.newPage();
await page.goto(url);

try {
const html = await page.content();
const $ = cheerio.load(html);
console.log($("#marquee_1").text());
} catch (e) {
console.log(e);
}

await browser.close();
}

在本機上執行結果在本機上執行結果

開機器

開免錢的就好開免錢的就好
系統用ubuntu,隨個人喜好就好系統用ubuntu,隨個人喜好就好

設定環境

機器開好後直接 ssh 連進去,首先先來安裝 nodejs

1
2
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - &&\
sudo apt-get install -y nodejs

接著安裝一些 chrome 的相關套件

1
2
sudo sudo apt update
sudo apt-get install ca-certificates fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils


上面這是 puppeteeer 官網的連結,對應不同的 linux 系統有不同需要安裝的套件

然後將我們寫好的爬蟲檔案跟 package.json 上傳,並且移到目標資料夾內

1
2
3
4
5
6
7
8
9
10
11
12
{
"name": "gcp-puppeteer-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"author": "",
"license": "ISC",
"dependencies": {
"cheerio": "^1.0.0-rc.12",
"puppeteer": "^20.8.0"
}
}

在專案資料夾底下新增一個檔案 puppeteer.config.cjs,並輸入以下內容後存檔離開

1
2
3
4
5
6
7
8
9
const {join} = require('path');

/**
* @type {import("puppeteer").Configuration}
*/
module.exports = {
// Changes the cache location for Puppeteer.
cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
};

然後執行 npm install 安裝套件,套件安裝完成後就可以執行程式了,我的爬蟲檔案叫 weather.js,因此就執行

1
node weather.js

萬事具備,成果揭曉萬事具備,成果揭曉

後記

如果在執行程式的時候出現錯誤,比方說出現 Error: Failed to launch the browser process!,那應該是漏了前面安裝 chrome 相關套件的原因,但我這篇的流程是完全開一個新 vm 來測試的,所以照著順序做就能夠成功,提供給有需要的做參考,這件事情也拌住了我一兩天,都差一點都想說要放棄改用 python 來寫爬蟲了呢。