puppeteer

Chrome / Chromium 在 59 時新增了一個叫做 Headless 的模式,就是可以透過 CLI 啟動 Chromium 並且執行瀏覽器可以做的任何動作。非常適合來做 Web 自動測試的工作,甚至可以做到像是抓取網頁文字、截圖、列印 PDF、⋯⋯等,非常適合來做網路爬蟲。

這邊記錄一些使用上的心得

在 Linux server 執行

Headless Chromium 也可以在純 CLI 的 Linux server 上執行,不過要注意的是要安裝一些 package 不然會一直有錯誤,至於哪些 package 呢?

可以看 GitHub 上 puppeteer 的 Dockerfile 來參考安裝

apt-get update && \
apt-get -y install xvfb gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 \
  libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 \
  libgtk-3-0 libnspr4 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 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget

sandbox 的問題

在 Linux 執行還會遇到 sandbox 的問題

Error: Failed to launch chrome!
[0412/184634.904033:FATAL:zygote_host_impl_linux.cc(116)] No usable sandbox! Update your kernel or see https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md for more information on developing with the SUID sandbox. If you want to live dangerously and need an immediate workaround, you can try using --no-sandbox.

要解決是有點麻煩,直接用 --no-sandbox 來避開比較快

let browser = await puppeteer.launch({ 
  args: [ '--no-sandbox']
})
贊助商連結
(adsbygoogle = window.adsbygoogle || []).push({});