Web自動化
這里所說的Web自動化是所有跟頁面相關的自動化,比如頁面爬取,數據抓取,頁面內容檢測,頁面功能測試,頁面加載性能測試,頁面回歸測試等等,當前主要由如下幾種解決方式:
文本數據獲取
這就是各種request
庫或者類似curl
這樣的工具做的事情,拿到的是頁面的文本,然后進行XML文檔解析,獲得相應的內容。但如果頁面有一些動態執行的內容,比如JavaScript生成跳轉URL,這樣就搞不定了,需要有JS引擎的工具來搞,比如再配合JS引擎自行實現的工具,或者直接使用瀏覽器內核來搞的工具。
按照瀏覽器的方式來執行
這就是各種使用瀏覽器內核來實現的工具,比如基於Webkit
的PhantomJS
, 基於Gecko
的SlimerJS
, 經過包裝的CasperJS
兼容PhantomJS
和SlimerJS
,以及基於v8
JS引擎和.net
平台的trifleJS
等。這些工具更新迭代跟不上Web標准的發展,新的Web標准無法得到良好的支持。
通過協議直接操作真實瀏覽器
這就是Selenium
的實現方式,通過WebDriver
協議進行通信,瀏覽器和瀏覽器驅動都實現了C/S結構的WebDriver
協議,Selenium
通過瀏覽器的驅動包,來發送操作請求,瀏覽器根據請求響應相應的操作。這樣實現有一個問題是始終有一個真實瀏覽器的界面在渲染和變化,一方面效率低下,另一方面在服務端環境無法運行。於是就衍生出了使用Xvfb(virtual framebuffer X Server)
來配合實現在服務器環境下的運行,基本解決了問題。但每一種瀏覽器的特性支持都依賴於相應的驅動的實現和支持情況。
無界面瀏覽器
前面的實現方式都或多或少有自己的問題或者局限,如果瀏覽器本身支持在服務端環境運行,這將是一個近乎完美的解決思路。Chrome
59開始支持無界面模式,Firefox 55支持Linux版的無界面模式,Firefox 56支持全平台的無界面模式,這樣一來,使用方不用被動等待瀏覽器的WebDriver
的實現。
Headless Chrome相關的對比
Headless 是一種在無圖形界面環境運行的一種能力,比如高性能的服務器端環境,參考Healess Software。
PhantomJS的問題
- 使用老版本的Webkit,不支持新的Web標准,跟真實瀏覽器存在差異
- 開發者維護難度大,主要維護者不干了,起因是Chrome 將支持 Headless模式
- 要解決的問題多,1800+
- 內存占用高,並發有問題,不穩定,有些奇奇怪怪的bug
Selenium的問題
- 使用WebDriver接口和瀏覽器驅動來操作真實瀏覽器,帶界面渲染,速度慢
- 需要有圖形界面,顯示設備的支持
- 需要使用Xvfb(virtual framebuffer X Server)
- X是架構無關的遠程圖形界面和輸入設備兼容的系統,C/S架構
- 在沒有物理輸入和顯示設備的機器上運行
- 這里可以簡單理解為虛擬顯示器或者顯示器模擬器
- 也支持Headless實現,實現跟Web標准有差異
- 通過ChromeDriver(WebDriver的Chrome實現)的來操作Chrome,需要依賴ChromeDriver的更新
- 可以在ChromeDriver下載查看支持的Chrome版本
Headless Chrome帶來的優勢
- 資源占用少(相對於PhantomJS)
- 服務端環境(命令行,無圖形界面)
- 支持現代Web標准和技術(ES6,ServiceWorkers,WebGL...)
- 行為符合Web規范、版本能自動更新
- Chronium/Chrome團隊維護