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