puppeteer填坑指南

puppeteer填坑指南

前言

原文地址:zhangzippo.github.io/posts/2019/…javascript

相信你們在使用puppeteer的時候會遇到各類各樣的問題,好比本來在mac上跑的好好的卻發如今centos/docker上遭遇各類各樣的問題, 這裏把我所遇到的坑跟你們說一下。html

安裝

首當其中就是安裝的問題了,這個在mac上沒什麼問題,這裏介紹在centos上的問題,puppeteer含有兩個包puppeteer VS puppeteer-core,什麼區別呢?簡單來講就是puppeteer = api+chromeium(最新),puppeteer-core = only Api,官方是這麼說的:java

puppeteer-core 與 puppeteer 不一樣的地方:node

  • puppeteer-core 在安裝時不會自動下載 Chromium。
  • puppeteer-core忽略全部的 PUPPETEER_* env 變量.

當你本身安裝chromeium的時候,在啓動(puppeteer.launch())的時候須要指定chromeium的啓動路徑,固然本身安裝存在更新的問題,可能因爲更新不及時致使與puppeteer的api不匹配的狀況,因此咱們推薦直接安裝puppeteer。而後呢,當你在centos上安裝的時候毫無疑問的會報錯。由於缺乏chromeium啓動的依賴,本人在centos6和7上都遇到了坑,下面是官方列舉的centos上的所需依賴:linux

pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-miscgit

只須要一頓 yum install 就好。固然事情可能不是這樣的,當你啓動chromeium時(推薦在服務器上測試的時候先進入到node_modules/puppeteer/.local-chromium/linux-496140/chrome-linux/chrome目錄下執行./chrome進行測試,能成功運行表明經過puppeteer的api調用也能成功)你可能會遇到例如:github

error while loading shared libraries: libpangocairo-1.0.so.0: cannot open shared object file: No such file or directory 這樣的錯誤,提示你缺乏的是一個so文件,你能夠在執行文件目錄下執行這個命令進行查看缺乏哪些依賴: ldd chrome | grep not 命令執行後會顯示你當前缺乏的依賴,當你不知道對應的.so在哪一個包中的時候執行這個命令: yum provides | grep xx.so.0chrome

找到對應的包進行yum install 安裝,注意32仍是64位的,不要裝錯。當ldd chrome | grep not 結果爲空時表明全部依賴都已經安裝,本人在centos6.5上測試時,安裝了全部依賴依然提示缺乏某個依賴,查了一下,居然發現存在於firefox的包中,很是費解,segmentfault.com/a/119000001… 這篇文章的做者與我遇到一樣的問題解決了,然而我相同作法後依然沒有解決,仍是沒法啓動chrome,並且chrome要依賴別的瀏覽器的包實在有點兒...後來google了一下好像是6.5版本對於chrome的支持有限,遂我換成了centos7.6,繼續,安裝很順利..沒什麼坑。其餘可能遇到下載chromium失敗的狀況,這個在.npmrc指定一下下載源docker

PUPPETEER_DOWNLOAD_HOST = npm.taobao.org/mirrorsnpm

啓動

你覺得安裝完就沒坑了?no,no,no。啓動還能坑你一回,若是你直接啓動會報這個錯誤:

No usable sandbox! Update your kernel or see chromium.googlesource.com/chromium/sr… for more information on developing with the SUID sandbox. If you want to livedangerously and need an immediate workaround, you can try using --no-sandbox.

啥意思呢?就是你正常應該將chrome運行在一個沙盒中,可是你沒配置,對應的網址和puppeteer的文檔中有寫怎麼操做建立沙盒,下面這個:github.com/GoogleChrom…

然而我照着作並不行,仍是報錯,因而採用planB 加 --no-sandbox,官方的例子是:

const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
複製代碼

咱們測試的時候能夠執行 ./chrome --no-sandbox --disable-setuid-sandbox 而後若是你是直接執行./chrome (js中的例子默認headless=true )你又會看到這個錯誤:

Gtk-WARNING **: 23:01:03.809: cannot open display 我不太熟悉linux,但這個意思就是說你不能打開一個圖形界面,別去百度了,若是你也是linux小白。咱們在後面加上 --headless 就能夠了,到此啓動也沒問題了。

運行puppeteer

啓動都沒問題了還有什麼坑呢?我這裏在使用時遇到一些問題,與你們共勉吧,若是你也遇到的話注意排查問題。

  • 遇到獲取頁面錯誤的問題 這個固然有不少可能了,好比缺乏cookie被攔截,這個好辦,還有一種狀況是某些網站存在反爬機制判斷UA標示不是瀏覽器端或者帶headless標示(chromeium headless模式默認UA會帶),因此你最終獲得的並不是想要的頁面,還有各類被重定向的狀況都有可能得不到想要的頁面,這個時候最好在 page = await page.goto(); 以後調用page.text()方法檢查頁面是否符合預期
  • timeout狀況 這個你們可能遇到的最多,goto方法加載一個頁面默認超時是30秒,你能夠更改,也能夠直接寫0表明一直等待。我遇到某些狀況致使頁面很慢才加載結束,尤爲是當你設置waitUntil = networkidle0的時候,怎麼排查這個問題呢?使用 page.on('requestfailed')方法看看什麼資源阻滯了頁面跳轉,page.on('request')方法攔截對應的請求abort()掉,我在應用中碰到線下機器訪問不了內網域名的狀況,苦苦跟了好久。

結尾

可能後面還會遇到不少坑,慢慢看吧.....

參考文章:

github.com/GoogleChrom…

相關文章
相關標籤/搜索