為了搭配下載圖片的程式,當然就會有需要一支可以讀網頁的程式囉

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長度,"編碼方式")
        轉成字串
*/
}

創作者介紹

Thinking in Robert

羅伯特 發表在 痞客邦 PIXNET 留言(13) 人氣()


留言列表 (13)

發表留言
  • 學java的路人
  • 大大這篇文真棒! 我正好有用到~
    目前小弟在撰寫一個抓取網頁原始碼的程式,
    恰好就是用到這篇文的第一種方法~

    但是有一點很苦惱,
    那就是抓下來->存成xxx.html(到這邊都是正常的)
    可是我把這xxx.html用瀏覽器打開就會變成亂碼...
    不過將字元編碼改成Big5就會正常(原本是UTF-8)
    不知道有沒有辦法可以解決...
    (例如都強制儲存成UTF-8格式之類的!?)
  • 學java的路人
  • 您好~上次我可能眼殘了一下, 沒注意到下面的留念部分...
    可以請問一下,下面那個判斷該怎麼做呢~
    不是很能夠理解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 上面去看看,一定會有人為您解惑的...
    到時再請您不吝與我分享囉
  • 學java的路人
  • 您好~經過幾週的查找, 我目前找到了一種較穩定的方法! 原始碼奉上~
    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是成功的~
    可能還要改善!
  • 學java的路人
  • 補充~
    .getContentType<--這次的功臣是這個東西~
    他能夠找到網頁內的資訊:
    這一列--> text/html; charset=utf-8 (此為yahoo首頁的測試結果)
  • 羅伯特
  • 謝謝您的回覆
    您真是太有心啦
    最近太忙,有空再來測測看
    謝謝
  • 感謝您的第一個方法
  • 我原本一直下載不到PHP網頁中的圖片
    現在都解決了
    真的很感謝您= ˇ =
  • qiying
  • 感謝你!這個網頁實在太棒了!
    以往找一些功能都要在google上搜尋拼湊很久,您讓我輕鬆解決了這個問題!
  • Nick
  • 感謝你!這個實在太棒了!您讓我輕鬆解決了這個問題!
  • 羅伯特
  • 哈, 今天突然發現自己當年寫過的一些東西, 竟然可以幫助到其他人, 這感覺真的很棒呀~~
  • Hardy
  • 版主您好 謝謝你的CODE
    想請教個問題
    這個程式使用在某些具框架的網站
    是否無法抓到整個原始碼?

    我試抓YAHOO的首頁 發現只得到一行而已
  • 訪客
  • 怎麼寫才可以跳過有問題的網頁
  • 訪客
  • 真的很方便,非常感謝樓主