2010年11月19日 星期五

WSH環境下運用Microsoft.XMLHttp物件抓取網頁資料

其實抓取網頁資料的方法很多,最方便的方法就是透過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)環境所提供的物件,其實已經可以用來達成許多作業需求。只是‧‧‧以前我怎麼都沒發現到?!

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...