許多 (browser) automation 的工具都用「鬼」命名 XDDDD phantomjs, slimerjs, casperjs, ghost.py ... 圖片來自:手滑背單字 的懶惰鬼 |
#以下為我撰寫小型 web crawler / automator 時常使用的工具與思路
觀察 & 分析
釐清要什麼以後,宜先人工操作網頁,並透過以下方式進行初步觀察:- chrome 開發人員工具 => network => 勾選 preserve log => 進行操作
- 觀察 http 封包的發送
- chrome 開發人員工具 => 點選左上角搜尋圖示 => 直接點擊欲觀察的網頁元素
- 在該網頁元素的程式碼部分,可以使用右鍵直接取得 xpath / csspath 的資訊
- 使用 visual event 觀察頁面上 javascript event 與 UI 的 binding 情況
個人工具箱
我慣用的工具有:(程式執行成本由低到高)- requests 函式庫,從 http 的層級解決問題
- 執行效率最佳
- 雖然位於底層,但最後不一定會是最繁雜的 solution
- 可無視許多 application UI 的操作邏輯
- 若上層的 application 過於複雜,會難以找出合法 http request 的格式
- 要處理的參數過多會導致需要花費很多時間測試
- 參數值越依賴 application 的運算,越難生成
- 隨著頁面跳轉、ajax 呼叫 ... 複雜度會上升
- 需要自行維持 headers / cookies 的值 ... 手動模仿部分瀏覽器行為
- mechanize / twill / mechanicalSoup 之類的函式庫,用精簡版的瀏覽器解決問題
- 執行效率次佳
- 部分瀏覽器的功能已經被實作,能帶來很大的方便
- 但是不能執行 javascript ,使得適用範圍小很多
- 函式庫會附帶一些便捷的 API ,協助填寫表單、點擊連結 ...
- 適合拿來跑簡單的 functional testing
- 至少可以不用擔心如何維持瀏覽器的狀態
- 拿來測 API 也並無不可
- 使用 phantomjs 等等內嵌 webkit 的工具,透過無視窗介面的瀏覽器解決問題
- 執行效率欠佳
- 能執行 javascript ,可高度模擬使用真實瀏覽器的情境
- 有廣大的社群以此為基礎,開發相關的 testing / automation ... tools
- casperjs 是高階,極為好用的封裝
- resurrectio 提供了 chrome plugin,可以人工錄製欲自動化的步驟以後,自動生成以 casperjs 寫的測試程式碼
- 還在開發初期,頗有機會測試程式碼會出錯,需要人工修改
- ghost.py 是 python 版本仿 casperjs 的函式庫
- 依賴 pySlide or pyQT ... 安裝得花功夫
- 能夠使用的 API 仍比 casperjs 少很多,文件亦不足
- 優點為:使用 python 寫出的程式碼架構,可讀性比 js 版本高非常多
- 使用 selenium 驅動瀏覽器,直接人工錄製欲自動化的步驟或進而匯出程式碼
- 執行效率欠佳,且大都需要視窗環境
- 驅動真實瀏覽器時,會顯示出視窗,好處是較容易除錯
- 亦可驅動以 phantomjs 為核心的 ghostdriver,不需顯示出視窗
- Selenium 的 Python 及各語言 binding,能夠讓開發者在習慣的環境下開發程式
- 直接使用錄製功能時,記錄下來的動作不一定具備正確重現性
- 亦即播放時仍可能出錯
使用策略、心得
對於簡單的網頁,特別是無須登入那種,requests 可以說是最佳解甚至直接使用 pyquery 就能快速完成 crawling + parsing 的工作
但是對於較複雜的網頁,常常會陷入 requests vs. casperjs 的抉擇
當評估用 requests 實作要太多時間,而能接受較慢的執行速度時
casperjs 算是一個比較快速的解法
換言之,以下可能是不錯的使用策略:
- 需要執行頻率高的 crawling 時,推薦用 requests
- 需要執行頻率低或有複雜 application 操作的 automation 時,推薦用 casperjs
實務上,要使用 requests 自幹時
千萬記得到 google / github 找找看有沒有人有做過同樣的事情
即便語言不同,只要能夠看懂 http 相關的操作
也很容易可以寫出自己的版本
反之,即便要走 casperjs 路線
也並不代表會一路順遂,因為仍然有一定的學習成本
- 高階的 resurrectio 能夠自動產生 casperjs 的 code ,但是不一定 work
- casperjs 有乍看醜醜,但是其實蠻完善的文件(建議讀完他)
- 分享幾個使用上的經驗:
- 網頁會有 popup 視窗的行為,要特別注意
- 使用 evaluate API 之前,盡可能看看其他 API 是否有提供包好的功能
- 可以關掉讀取圖片的功能,大幅加速程式速度
- 我個人會透過擷取圖片功能,事後看各個步驟的執行結果
原本我以為若使用casperjs ,就可以在幾個小時之內馬上完成工作
結果一邊撞 javascript / casperjs 的牆,一邊讀文件後
最後還是花費了超過一天才完成工作 ...
當然,熟悉這個工具以後,會認為付出是划算的
歡迎補完
本文沒有探討 parsing 或是 crawling 的深入議題,僅只是介紹寫寫小 scripts 時的工具
若有朋友知道有什麼好物,請推薦給我啊啊啊!
若有朋友知道有什麼好物,請推薦給我啊啊啊!