為了搭配下載圖片的程式,當然就會有需要一支可以讀網頁的程式囉
Robert 在 JavaWorld 裡面爬文了很久,終於找出幾個不同的方法
其中以read1()那個方式最合適,檔案內容不會亂掉,
也不用管網頁編碼,好處多多...
目前個人初淺的看法是因為用 [ 位元串流] 的方式讀出/寫入
所以效果比較好,後續繼續觀察看看....
import java.net.*;
import java.io.*;
public class ReadWebPage {
public static void main(String[] arg) throws Exception {
String web1 = "http://tw.news.yahoo.com/article/url/d/a/100712/8/293ny.html" ;//UTF-8
String web2 = "http://bin.ton.net/books_detail.asp?id_book=205"; //Big5
String web3 = "http://zh.wikipedia.org/w/index.php?title=%E9%A6%96%E9%A1%B5&variant=zh-tw";
read1(web1);
read2(web1);
read3(web1);
}
//以這個方法取出來的檔案內容格式,最合適,不會亂掉,也不用管網頁編碼
public static void read1( String strURL ) {
int chunksize = 4096;
byte[] chunk = new byte[chunksize];
int count;
try {
URL pageUrl = new URL(strURL );
// 讀入網頁(位元串流)
BufferedInputStream bis = new BufferedInputStream(pageUrl.openStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("URL1.txt", false));
System.out.println("read1() running " );
while ((count = bis.read(chunk, 0, chunksize)) != -1) {
bos.write(chunk, 0, count); // 寫入檔案
}
bos.close();
bis.close();
System.out.println("Done");
}catch (IOException e) {
e.printStackTrace();
}
}
//*******************************************************************************************
///以這個方法取出來的檔案內容格式,變成一行,不易閱讀,需注意網頁編碼
public static void read2( String strURL ) {
System.out.println("read2() running");
try {
URL url_address = new URL( strURL );
// 讀入網頁(字元串流)
BufferedReader br = new BufferedReader(new InputStreamReader(url_address.openStream(), "UTF-8"));
//BufferedReader br = new BufferedReader(new InputStreamReader(url_address.openStream(), "Big5"));
BufferedWriter bw = new BufferedWriter(new FileWriter("URL2.txt", false));
String oneLine = null ;
while ((oneLine = br.readLine()) != null) {
bw.write(oneLine);
}
bw.close();
br.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Done");
}
//*******************************************************************************************
//以這個方法取出來的檔案內容格式,變成一行,不易閱讀,需注意網頁編碼
public static void read3( String strURL ) {
System.out.println("read3() running");
try {
String line = null;
//另一種連接網頁的方式
URL url = new URL(strURL);
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
uc.connect();
InputStream is = uc.getInputStream();
/// 讀入網頁(字元串流)
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
//BufferedReader br = new BufferedReader(new InputStreamReader(url_address.openStream(), "Big5"));
BufferedWriter bw = new BufferedWriter(new FileWriter("URL3.txt", false));
while ((line = br.readLine()) != null) {
bw.write(line);
}
br.close();
bw.close();
}
catch(Exception e) {
System.out.println("發生了" + e + "例外");
}
System.out.println("Done");
}
/* 以下這是前輩的說明,由於還沒有機會用,所以先放在這裡留念一下
若是讀取靜態的檔案, 且要知道該檔案之內定字元編碼, 唯一的方法就是
以 ByteArrayInputStream 去讀該檔案, 並且辨別該檔案檔頭之位元組為何
辨別檔案的方法, 先讀完全部檔案, 再區別
utf-8 前三bytes 分別為 -17,-65,-69 ----> offset=3
utf-16le 前二bytes 分別為 -1,-2 ----> offset=2
utf-16be 前二bytes 分別為 -2,-1 ----> offset=2
MS950, BIG5, .... 無 ----> offset=0;
讀完後再呼叫 new String(全部bytes,offset,全部bytes長度,"編碼方式")
轉成字串
*/
}

大大這篇文真棒! 我正好有用到~ 目前小弟在撰寫一個抓取網頁原始碼的程式, 恰好就是用到這篇文的第一種方法~ 但是有一點很苦惱, 那就是抓下來->存成xxx.html(到這邊都是正常的) 可是我把這xxx.html用瀏覽器打開就會變成亂碼... 不過將字元編碼改成Big5就會正常(原本是UTF-8) 不知道有沒有辦法可以解決... (例如都強制儲存成UTF-8格式之類的!?)
您好~上次我可能眼殘了一下, 沒注意到下面的留念部分... 可以請問一下,下面那個判斷該怎麼做呢~ 不是很能夠理解byte分別為-17 -65 -69--->offset=3這種意思呢... 小弟是有想到一個做法, 就是在程式碼中加入判斷機制, 搜尋網頁原始碼有無提到是BIG5或是UTF-8等字眼, 例如 <meta http-equiv="Content-Type" content="text/html; charset=big5"/> 當中的BIG5發現之後, 變在寫入/讀出的部分加入BIG5! 可是有些網站並不會有這種東西, 就變得可能會出現bug... 所以想了解一下您最後所說的那個做法!
您好 其實最下面的文字說明部分,是我在 Java World 上面找到的訊息... 但是小弟學淺,也不知道該如何運用, 所以一直都懸在那邊,沒機會進一步測試哩.. 或許您可以移駕 Java World 上面去看看,一定會有人為您解惑的... 到時再請您不吝與我分享囉
您好~經過幾週的查找, 我目前找到了一種較穩定的方法! 原始碼奉上~ import java.net.URL; import java.net.URLConnection; import java.io.IOException; import java.util.Date; try{ //字碼確定 URL url=new URL (httpUrl); c = url.openConnection(); c.connect(); String encod = c.getContentType().substring(c.getContentType().lastIndexOf("=")); unicode = encod.substring(1,encod.length()); } 這樣就能事先查詢此網頁的編碼是用什麼! 只要讓寫入和讀出的部分先用這段程式碼轉換過, 再回傳適當的編碼,EX: UTF-8或BIG5~~ 這樣寫入讀出就會比較穩定~ 也算是解決掉網頁編碼的問題! 不過目前只有實測過BIG5和UTF-8是成功的~ 可能還要改善!
補充~ .getContentType<--這次的功臣是這個東西~ 他能夠找到網頁內的資訊: 這一列--> text/html; charset=utf-8 (此為yahoo首頁的測試結果)
謝謝您的回覆 您真是太有心啦 最近太忙,有空再來測測看 謝謝
我原本一直下載不到PHP網頁中的圖片 現在都解決了 真的很感謝您= ˇ =
感謝你!這個網頁實在太棒了! 以往找一些功能都要在google上搜尋拼湊很久,您讓我輕鬆解決了這個問題!
感謝你!這個實在太棒了!您讓我輕鬆解決了這個問題!
哈, 今天突然發現自己當年寫過的一些東西, 竟然可以幫助到其他人, 這感覺真的很棒呀~~
版主您好 謝謝你的CODE 想請教個問題 這個程式使用在某些具框架的網站 是否無法抓到整個原始碼? 我試抓YAHOO的首頁 發現只得到一行而已
怎麼寫才可以跳過有問題的網頁
真的很方便,非常感謝樓主
剛好找到我要的程式碼,謝謝你的整理。