除了網站開發與維護,撰寫爬蟲也是不少後端工程師的工作項目,而眾多爬蟲開發工具裡的 Selenium,因其操作流程更貼近一般使用者,成為了爬蟲、網頁前端測試的一時之選。也由於 Selenium 支援眾多程式語言,包含筆者愛用的 Ruby,所以被納入了武器庫中,此系列文由此而生。
本文會先比較 Selenium 與 HTTP 連線工具,並交代前置作業與結論,下一篇才進入實作。
Selenium vs. HTTP 連線工具們
為何說 Selenium 更貼近一般使用者,就在於它直接操作瀏覽器,因此瀏覽器私下幫我們做的事就不用額外寫了。列舉如下:
- 塞 headers 讓網站判斷人機操作(user or bot)
- 塞 cookies 讓網站確認使用者狀態(user status and client data)
- 渲染前端頁面(超級有感)
而 Unix-like 底下的 curl 1、Ruby 家的 HTTP clients(faraday、httprb/http、…)都要額外處理上述事項。
Selenium 帶給筆者的另一震撼,是幾乎不用先備 HTTP protocol 相關知識。
一般人上網並不須要懂 GET / POST 等為何物,只管點滑鼠就好,使用 Selenium 套件可充分發揮這個優點,因此對新手來說 Selenium 比各家 HTTP clients 函式庫更易上手(何況還要另外學相應的 HTML parser)。身為 Web 工程師不可不知 HTTP protocol,但此系列文確實不需要相關知識。
當然它也有其不足處,以下列舉幾個其他工具的優勢:curl 可以打許多 HTTP 以外的連線協定;串接 API 還是 HTTP clients 更快更方便,因為不用解析 HTML。
了解各方優缺,才知道什麼情境適合什麼工具。
整個系列文將以 Michael Chen 部落格 Selenium 網路爬蟲 的前幾篇作為題目,且換用 Ruby 而非 Python 來實作,之後再自訂一些案例來驗證是否已能掌握 Selenium。
前置作業
確認有可用的 Ruby 版本:
foo@bar:~$ ruby -v # 取得當前 Ruby 版本,筆者使用 ruby 2.5
安裝 Selenium 的 Ruby 套件 selenium-webdriver:
foo@bar:~$ gem install selenium-webdriver
安裝個人偏好的瀏覽器 webdriver 2,如平常用 Chrome 就對應到 chromedriver,筆者使用蘋果電腦所以抓 mac 專用的版本。把解壓縮後的檔案放到\usr\local\bin
即可。蘋果用戶也可以透過 Homebrew 安裝。
chromedriver 載點: http://chromedriver.chromium.org/downloads
結論:為何學習 Selenium?
- 更貼近一般上網行為
- 方便擷取前端渲染的資訊3
- 文件、線上資源豐富
- 支援多數主流程式語言
- 幾乎不用擁有 HTTP protocol 知識
- 部分情境下學一套抵兩套 4
- 專案仍然活躍,可預期會持續維護5
- 未來前端測試可用6
-
注意不是抓最新的 webdriver 就可以,而是要挑與目前瀏覽器匹配的 webdriver。 ↩
-
前端渲染指的是伺服器傳送包含 javascript 程式的 html 頁面給瀏覽器,瀏覽器再根據用戶行為動態完善相應資訊。相反的,後端渲染則為伺服器已把動態資訊跑完,產出純 html 頁面給瀏覽器,比如 Rails 預設使用的 Embedded Ruby (erb 範例)。私以為前端渲染、後端渲染改稱瀏覽器端填空、伺服器端填空更直白。 ↩
-
兩套指的是 HTTP 連線工具 + HTML 解析器,像是 Ruby 家的 faraday + Nokogiri、Python 家的 requests + BeautifulSoup。 ↩