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