前兩天想寫一段自動提取微網誌狀态的代碼。據我所知,實作這個功能即可以用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();
}
}