跳到主要內容區塊

計資中心電子報C&INC E-paper

專題報導

透過 phpQuery 來蒐集政府公開資訊之網頁 - 以司法院大法官解釋為例
  • 卷期:v0028
  • 出版日期:2014-03-20

作者:楊德倫 / 臺灣大學計算機及資訊網路中心教學研究組幹事


在民主發展迅速、人權意識高漲之下,各級機關及學術界,對於憲政體制之落實極為關注,透過大法官解釋,得以健全憲政體制、加強人權保障,同時利於需要參閱之人。市面六法改版頻繁,蒐集不易,在政府資訊公開電子化之過程中,可至司法院網站進行瀏覽,惟尚需一勞永逸之方法來整理歸納,phpQuery的使用,正為得以效勞之處。

 

前言
對程式設計人員而言,抓取網頁所公開的資料,是一項最為基本的技術。由於「即時資訊」之重要性快速提升,對高度強調即時性之產業而言,對資料的擷取即變得非常重要。phpQuery 是一個伺服器端的類別庫,以 PHP5 來加以撰寫,其 API 乃基於 jQuery JavaScript Library 而設計,相似的語法,相似的運作的方式,若對 jQuery 有一些了解,想必更能加速 phpQuery 的熟悉程度。

 

Art editor Img
圖(一)phpQuery的圖示

 

前置作業
在使用 phpQuery 之前,我們必須先將某個特定網頁元素和文字進行擷取,此時我們需要一種機制來為我們取得網頁資料,最為常見的方法為 cURL。 cURL 是一個使用多種通訊協定(例如 FTP, FTPS, Gopher, HTTP, HTTPS, SCP, SFTP, TFTP, Telnet, DICT, the file URI scheme, LDAP, LDAPS, IMAP, POP3, SMTP, RTSP 等等),提供函式庫和指令列工具來進行資料轉換的一種專案,此專案提供相關工具與功能,透過 URL 的相關語法來取得與傳遞資料,而至於過於細節的介紹,實非所論。之後的解說,皆以實務為主,大家依樣操作即可,而效能方面,待大家自行調校,不多贄述。



我們必須先在網頁伺服器上安裝 php5、curl 套件,讓伺服器支援 php5 和 curl 功能,安裝 php5 是為了支持 phpQuery,而 curl 是為了讓我們可以取得網頁元素和相關文字資訊,以作為整理相關資的前置作業。

 

Art editor Img
圖(二)透過 phpinfo() 函式確認 PHP 是否安裝成功

 

Art editor Img
圖(三)檢查、確認 curl 是否已安裝、掛載

 

步驟一:引入 phpQuery 檔案(類別)
在撰寫程式前,必須引入 phpQuery 類別的檔案,才能進行操作。

Art editor Img
圖(四)引入 phpQuery 檔案

 

步驟二:用 cURL 設定 Request Header,準備用來模擬瀏覽器
我們可以將 Header 格式放進陣列當中,作為 cURL 相關設定的參數之一,同時可比對 chrome 瀏覽器中的「檢查元素」功能,在重新讀取頁面後,得到 Header 相關訊息。

Art editor Img
圖(五)將 Request Header 放至陣列當中

 

Art editor Img
圖(六)用 chrome 檢查網頁元素,查詢 header

 

步驟三:配置 cURL 相關參數
在 php.net 官網中,可參閱 cURL 相關函式。先行創建一個 cURL resource,並透過 curl_setopt() 來設定相關參數,在我們的範例中,會設定 CURLOPT_URL、CURLOPT_RETURNTRANSFER、CURLOPT_HTTPHEADER三個參數。CURLOPT_URL 是設定欲抓取網頁之「連結」;CURLOPT_RETURNTRANSFER 若設定為 TRUE,則會將抓取的網頁元素當成字串傳回來,反之則呈現該網頁的原貌;CURLOPT_HTTPHEADER 是將前面的 Request Header 陣列帶入後,將自己模擬成瀏覽器,以利於抓取網頁元素。

Art editor Img
圖(七)cURL 相關函式

 

Art editor Img
圖(八)curl_setopt 的用法

 

Art editor Img
圖(九)創建、初始化一個 cURL resource

 

步驟四:取得網頁元素與資料
參數設定完成後,我們要準備執行 cURL。此時要透過 curl_exec() 來執行設定的結果,並用 phpQuery 將抓回來的網頁元素加以整理,以成為我們所需要的資料。phpQuery 宣告方式有許多種,我們欲取得網頁元素,故以 HTML 為優先(phpQuery::newDocumentHTML),再按照圖中之程式碼加以執行,便能檢視程式執行完畢之成功。當中有使用 str_replace() 來取代原文字之顏色,使閱讀者便於強調自訂的關鍵字。phpQuery 的語法近似於 jQuery,在程式撰寫中,phpQuery 透過「->」來進行功能串接,而 jQuery 是以「.」來運作。

Art editor Img
圖(十)設定參數程式碼

 

Art editor Img
圖(十一)phpQuery 的宣告方式

 

Art editor Img
圖(十二)程式碼範例

 

Art editor Img
圖(十三)透過str_replace函式,來改變文字顏色

 

Art editor Img
圖(十四)網頁呈現結果

 

政府資訊公開的新里程:Open Data
在政府提供資訊公開介面以前,往往需要使用前述方式進行資料擷取,近年來政府開始重視「即時資訊」,於是發展出 Open Data 之概念,例如中央氣象局開放資料平臺、新北市政府資訊開放平台…等,透過提供 xml、csv、json 等普遍資料交換格式,來達到政府資訊公開的精神,使得程式人員便於取得開放資料,透過程式的開發,產出更有利於大眾的程式或應用服務。

Art editor Img
圖(十五)中央氣象局開放資料平臺

 

Art editor Img
圖(十六)中央氣象局 Open Data 說明

 

Art editor Img
圖(十七)提供 XML 讓程式人員串接,並定時更新

 

Art editor Img
圖(十八)新北市政府資料開放平台

 

Art editor Img
圖(十九)新北市政府 Open Data 說明

 

Art editor Img
圖(二十)提供 XML 讓程式人員串接,並定時更新

 

後記
phpQuery強大之處,就如同 jQuery 般,使程式設計人員愛不釋手, phpQuery不僅可擷取 xml 來加以分析與運用(phpQuery::newDocumentXML),同時又是後端所使用之程式語言,較 jQuery 在前端應用上,更能利於資料儲存。

參考資料
[1] 司法院大法官解釋網站
http://www.judicial.gov.tw/constitutionalcourt/P03_0001.asp
[2] phpQuery project
https://code.google.com/p/phpquery/
[3] PHP documents for Client URL Library
http://tw2.php.net/manual/en/book.curl.php
[4] 中央氣象局開放資料平臺
http://opendata.cwb.gov.tw/
[5] 新北市政府資料開放平台
http://data.ntpc.gov.tw/NTPC/od/last
[6] cURL 專案團體
http://curl.haxx.se/