天天看點

java 抓取内容_Java 抓取網頁内容

前兩天想寫一段自動提取微網誌狀态的代碼。據我所知,實作這個功能即可以用PHP寫,也可以用Java寫。我認為用Java寫調試友善一點,PHP的腳本還要上傳到伺服器什麼的。

代碼很簡單的,建立一個java.net包的URL類的對象,以這個url做為寫入源,内容儲存在字元串中。然後建立一個檔案,把字元串寫出即可。不過要注意,不同網站使用不同的編碼字。現在大多數的網站使用utf-8字元編碼,基于wordpress搭建的網站都是使用這種編碼字元的。但是,很多中文網站,包括網易等門戶網站,還是使用gb2312編碼。一方面gb2312的曆史比utf-8要久一些,早期的中文網站以gb2312搭建,現在再修改工作量太大;另一方面,顯示同樣長度的文字内容,用gb2312編碼比用utf-8編碼要節省空間。真是因為有這個差別,是以輸入網頁html代碼的時候要選擇正确的讀入方式。java的inputstream構造函數可以選utf-8作為一個參數傳入,但是沒有gb2312這個選項。是以抓取網易的網頁時,儲存下來的文檔就會出現亂碼。

另外,這個例子隻是抓取靜态的網頁内容,對于微網誌的狀态還是不行,因為要抓取狀态就要先登入賬号,這就要參考新浪的API文檔。

import java.beans.FeatureDescriptor;

import java.io.*;

import java.net.*;

public class spider {

public static String fetchWebpage(String urlname){

URL url;

String s;

StringBuffer sbuffer = new StringBuffer();

try{

url = new URL(urlname);

// my website use utf-8, but some other websites, like 163 and baidu, use gb2312.

InputStreamReader sreader = new InputStreamReader(url.openStream(),"utf-8");

BufferedReader breader = new BufferedReader(sreader);

while((s=breader.readLine())!=null){

sbuffer.append(s);

}

breader.close();

}catch(Exception e){

e.printStackTrace();

}

return sbuffer.toString();

}

public static void main(String[] args) throws IOException {

// TODO Auto-generated method stub

String address = "http://www.mr-naive.com";

FileOutputStream fos = new FileOutputStream(new File("myPage.html"));

OutputStreamWriter oswrite = new OutputStreamWriter(fos, "utf-8");

BufferedWriter bwriter = new BufferedWriter(oswrite);

bwriter.write(fetchWebpage(address));

bwriter.close();

}

}