2014/09/24

Web 測試及網路爬蟲的工具 Splinter

  最近在研究如何自動化到一些網站抓資料,一開始某些靜態網頁比較簡單,不管是用Java 或 PHP 都可以抓下來。但遇到一些使用 JavaScript / AJAX 及網頁會重導到其它頁的動態網頁真的是沒法子,特別是一些還要輸入日期或其它資料的表單網頁。參考了"網路機器人,網路蜘蛛與網路爬蟲 PHP/CURL 程式設計指南"這本書中介紹的工具 iMarco ,但仍無法全自動化。接下來把腦筋動到要用 C# 來控制 IE (Internet Explorer) ,可是時間上不允許,只好再找工具,最後找到了 Splinter 這工具,它其實預設是搭配Selenium 這個 web 測試自動化工具,雖然 Selenium 這個工具有 FireFox plugin , 也有 IDE ,Splinter 才能真正做到全自動化。

     根據官方網站(http://splinter.cobrateam.info/)的介紹,它是一個 open source 工具,用來測試 web 應用程式。使用的語言是 Python。可以讓你自動化瀏覽器的行為,例如:變換網址 (URL)及與網頁互動。

    這裡先介紹在 Windows 平台如何安裝,Linux / Mac OS 比較簡單:
  1. 先到 Python 官網(http://www.python.org)下載 Python 來安裝 , Python 2, Python 3皆可
  2. Google 找一下 get-pip.py ,下載到自己指定目錄
  3. 執行 python get-pip.py 將 pip 安裝起來
  4. 安裝 splinter : 執行 python -m pip install splinter
以上步驟完成後就可以參考 splinter 官網中的範例來測試一下。目前我在 Windows 7 中安裝的是 Python  2.7.8,執行以下程式片段可以執行 FireFox 連上 Yahoo 奇摩,還可以自動輸入關鍵字"CSS3"搜尋成功。


from splinter import Browser
b = Browser()
url = "tw.yahoo.com" b.visit(url); url = "http://tw.yahoo.com"
b.visit(url)
b.fill('p', 'CSS3')
btn = b.find_by_id('searchsubmit')
btn.click()



    當然,前題是要對 html 及 Python 有點了解才能發揮 splinter 的功能。能自動輸入與網站互動後找到所要的網頁資料才只是第一步,資料能取回來存放才是後續的工作重點。在尚未找到 splinter 之前,也使用過 crawler4j 及 Scrapy ,現在終於有個簡單的工具可用了,後續會再介紹一些實例。

安裝 get-pip.py 訊息:
D:\download>python get-pip.py
Downloading/unpacking pip
Downloading/unpacking setuptools
Installing collected packages: pip, setuptools
Successfully installed pip setuptools
Cleaning up...

    不建議使用 IE,預設使用FireFox , 若沒有安裝 FireFox 也請先將它裝好,官方網站說也可以使用Chrome 及 IE,但在Windows 下尚未試成功。也不建議在 Windows cmd.exe 下執行 python.exe 會有編碼問題,請使用 IDLE。或是先使用 chcp 將 code page 先改成 utf-8,在Linux 中沒有這個困擾,或是可以使用Eclipse 安裝 PyDev plugin。在Eclipse 中開發Python 程式是很愉快的。

    當然直接使用 Selenium 可以配合其它程式語言如: C#及 Java,但仍然不如使用 Python 這種script language 來得好用,為使麼呢?因為每次遇到一個新的網頁要爬資料時,都會先開啟瀏覽器檢視網頁原始碼的功能,了解到該頁的HTML DOM 結構,特別是你所要抓的資料是屬於那一個Table 或是那一個 id , name 之類的。這時候可以在Python 的IDLE 環境中一步一步慢慢試,不用每次執行前都要編譯,省事多了!

當使用 splinter 連上網站網頁資料時最好搭配 BeautifulSoup 4 。用起來會更方便,但遇到動態網頁時,使用 splinter 搭配JavaScript 才能針對一些AJAX 網頁及forward 網頁或openwindow 做更進一步的控制。特別是一些要輸入查詢條件及選擇日期等,有了JavaScript 的配合幾乎能克服一些難搞的狀況。等工作較不忙時,希望能整理一些心得及實例分享給大家。