2011年11月1日 星期二

Rhino環境應用Java的URL類別抓取網頁資料

前篇「應用readUrl函數取得網頁資料」使用的是Rhino環境提供的函數readUrl()抓取網頁資料,算是方便又簡單的抓取網頁資料方法,這篇改以呼叫Java的URL類別實作抓取網頁資料的作法。
其實會想自行改用Java的URL類別抓取網頁連線,主要是看到這篇文章「java HttpURLConnection來實作get及post動作」的範例與說明,該文章同時介紹了GET與POST方法;GET部份其實用函數readUrl()就可以達成,但POST部份就沒看到Rhino環境有提供適用的函數,看來要想辦法自行設計,剛好「借」該篇文章的程式碼來改看看。
在這裡先試著完成比較簡單的GET方法,底下程式碼就是應用Java的URL類別完成抓取樂透彩網頁的程式碼:

/**
 *
 * Rhino環境應用Java的URL類別抓取網頁資料
 *
 * @author ace
 *
 * @version 2011/10/31 v0.1
 *
 * @see <a href="http://blog.yslifes.com/archives/367">java HttpURLConnection來實作get及post動作</a>
 * @see <a href="http://blog.xuite.net/ray00000test/blog/32131847">下載網頁檔案、擷取網頁html</a>
 * 
 * @description
 *
 */

load("js/rhino/InitialEnv.js");

try {
  // 威力彩(http://www.taiwanlottery.com.tw/Lotto/SuperLotto638/history.aspx) 
  var strSourceURL = new String("http://www.taiwanlottery.com.tw/Lotto/SuperLotto638/history.aspx"); 
  var strTargetFile = new String("C:\\Dev-Rhino\\SuperLotto638.html");

  // 資料寫入檔案(UTF8編碼格式)。
  var filTarget = new java.io.File(strTargetFile);
  var fisTarget = new java.io.FileOutputStream(filTarget); 
  var BufferedWriter = new java.io.BufferedWriter(new java.io.OutputStreamWriter(fisTarget, "UTF-8"));

  var URL = new java.net.URL(strSourceURL);
  var URLConnection = URL.openConnection();

  var isSource = new java.io.InputStream(URLConnection.getInputStream());
  var BufferedReader = new java.io.BufferedReader(new java.io.InputStreamReader(isSource, "UTF-8"));
  
  var strTemp = new String();
  while ((strTemp = BufferedReader.readLine()) != null) {
  
    BufferedWriter.write(strTemp);
    BufferedWriter.newLine();
  }
}
catch (e) {
  print("執行過程有誤,錯誤訊息:" + e.message);
}
finally {
  if (BufferedWriter != null) {
    BufferedWriter.flush();
    BufferedWriter.close();
  }  
} 
修改之後的程式碼與原文章「java HttpURLConnection來實作get及post動作」介紹的GET方法略有出入,原文章尚有補強header送出的字串,看起來比較完整;只是改到Rhino環境的JavaScript語法遇到一些狀況,所以略微調整成以上的程式碼。(其實是碰上轉型的問題,原文章採用Java語言設計,再將URL類別轉型成HttpURLConnection類別後再接續進行連線設定與操作;但在JavaScript語法中沒有轉型語法,故原文章介紹的程式碼無法完整在Rhino環境完成,只好變通改以URL類別直接操作。)
儘管少掉送出header的功能,也不如原文章「java HttpURLConnection來實作get及post動作」設計的完整,但以上精簡後的版本還是可以用來抓到樂透彩網頁資料,也算達到目的。至於轉型的問題,目前正在找資料,看有沒有解決的方法 ~_~

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...