前两天想写一段自动提取微博状态的代码。据我所知,实现这个功能即可以用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 {

	/**
	 * @param args
	 */
	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();
	}

}