其實會想自行改用Java的URL類別抓取網頁連線,主要是看到這篇文章「java HttpURLConnection來實作get及post動作」的範例與說明,該文章同時介紹了GET與POST方法;GET部份其實用函數readUrl()就可以達成,但POST部份就沒看到Rhino環境有提供適用的函數,看來要想辦法自行設計,剛好「借」該篇文章的程式碼來改看看。
/** * * 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動作」設計的完整,但以上精簡後的版本還是可以用來抓到樂透彩網頁資料,也算達到目的。至於轉型的問題,目前正在找資料,看有沒有解決的方法 ~_~
沒有留言:
張貼留言