其實抓取網頁資料的方法很多,最方便的方法就是透過wget工具,大部份抓取網頁資料的需求都應該應付得來,除非有特別的應用場合,否則實在不需要另外自行寫程式來取得網頁資料。只是從「JScript 程式設計與應用:WSH」取得的Source Code中發現到可以應用WSH搭配ActiveXObject("Microsoft.XMLHttp")物件的方式來取得網頁資料,順手記錄下來。
對於網頁設計者來說,ActiveXObject("Microsoft.XMLHttp")物件的用法應該不陌生,在運用AJAX的場合中就需要使用這個物件讓IE瀏覽器可以跟Web Server進行資料的互動,使網頁得到更好的互動效果。只是基於安全考量,AJAX的使用被設下部份的限制(細節可以參考「AJAX的安全性問題[筆記]」文章中的說明),因此在設計網頁的情形下是不能隨意使用這個物件抓取網頁資料。
當轉換到WSH(Windows Script Host)環境時,也就沒有AJAX的限制,因此搭配ActiveXObject("Microsoft.XMLHttp")物件後就可以用來作為取得網頁資料的方式。程式寫法與網頁設計的方式雷同,完整程式碼如下:
<?xml version="1.0" standalone="yes" encoding="big5"?> <package> <job> <script type="text/javascript" language="javascript" charset="utf-8"> <![CDATA[ /** * * 取得資料。 * * @author ace * * @version 2010/11/11 v0.1 * * @returns {String} 取得之資料字串。 * * @requires Microsoft.XMLHttp * */ function getHttp() { var strReturn = new String(""); var strURL = new String("http://tw.stock.yahoo.com/q/q?s=2002"); var objXMLHttp = new ActiveXObject("Microsoft.XMLHttp"); objXMLHttp.open("GET", strURL, false, ""); objXMLHttp.send(); // todo: 加入是否正確取得資料之判斷式。 var strReturn = new String(objXMLHttp.responseText); return strReturn; } /** * * 寫入檔案。 * * @author ace * * @version 2010/11/15 v0.1 * * @param {String} astrFileName 檔案名稱。 * @param {String} astrContent 資料內容。 * @requires Scripting.FileSystemObject * * @see <a href="http://programming.top54u.com/post/Javascript-FSO-CreateTextFile-Method.aspx">Javascript FSO CreateTextFile Method</a> * @see <a href="http://programming.top54u.com/post/Javascript-FSO-OpenTextFile-Method.aspx">Javascript FSO OpenTextFile Method</a> * @see <a href="http://blog.yam.com/netpc/article/29930584">NetPC.World: Microsoft VBScript 執行階段錯誤: 程序呼叫或引數不正確</a> * * @description 2010/11/15 使用UNICODE編碼格式寫入檔案。 * */ function writeToFile(astrFileName, astrContent) { // 需注意取回之網頁文字編碼狀況,建立對應之編碼文字檔,否則呼叫Write Method時會意外出現「程式呼叫或引數不正確」之錯誤訊息。 var objFSO = new ActiveXObject("Scripting.FileSystemObject"); var objFile = objFSO.OpenTextFile(astrFileName, 2, true, -1); objFile.Write(astrContent); objFile.Close(); } // Program Start Here var strFileName = new String("index.html"); try { writeToFile(strFileName, getHttp()); } catch (e) { WScript.Echo("執行過程有誤,錯誤訊息:" + e); } ]]> </script> </job> </package>
程式功能就是取得雅虎股市的中鋼(2002)成交資料,並將取得結果存放至程式執行目錄下的index.html檔案。當中還缺少一些防錯的判斷,但已可正常執行並取得資料。
靈活的JavaScript程式語法,再配合WSH(Windows Script Host)環境所提供的物件,其實已經可以用來達成許多作業需求。只是‧‧‧以前我怎麼都沒發現到?!
沒有留言:
張貼留言