超小开源爬虫Crawler学习笔记

      近日,想写一个小型的爬虫框架,可惜的是,zero并没有写框架的经验。因此有必要找一个现有框架来参照下。GOOGLE了下,发现Crawler最适合作为将要写的框架的参照物。Crawler是一个简单的爬虫框架,它实现了爬虫的共同部分,如URL拼接,网页编码等,使得用户可以专注于提取网页内容(原文:Crawler is a simple Java web crawler/spider/joe or any other name you want to call it. The main goal is to abstract that boring and error-prone code from your codebase and let you focus on crawling the site. )。阅读Crawler源码的过程中,发现有不少值得借鉴的地方,因此将其逐一记录下来。

1. URL的拼接(UrlUtils.java)

      从网页提取出来的URL(uniform resource locator)有可能是完整的,也有可能是相对的。但是在请求网页时,只能使用完整的URL。因此要将相对URL变为完整URL。在转换之前,最好先了解URL的语法:
scheme://domain:port/path?query_string#fragment_id
其中scheme指各种协议,如http, https, ftp等;domain指服务器的域名或者IP;port指端口号;path指文件所在目录;query_string是服务器上某个程序的输入数据;fragment_id指页面的某个位置,其功能是让用户打开某个网页时,自动定位到指定位置上。

     根据这个语法,可以得到的拼接步骤如下:
a. 根据各部分的特征(如scheme出现的情况下,一定是出现在最前面),将URL拆为scheme, domain, path, query_string, fragment_id这5个部分
b. 按照scheme, domain, path, query_string, fragment_id的顺序检查URL。如果缺少某部分就将其补上
c. 如果URL中出现"&",则将其全部替换为"&"
d. 将URL编码为UTF-8,这是为了防止提取的URL含有中文。

2. 网页源码的编码的获取

      网页源码的编码探测一般有两种方式,一是分析网页源码中Meta信息,如contentType,来取得编码。另一种是使用统计学和启发式方法对网页源码进行探测。由于某些网页的contentType不包含编码信息,所以第一种方法不一定行得通,这时就要用第二种方式了。IBM的ICU4J库就实现了第二种方式,用法如下:

    /**
     * 得到网页所用编码
     * @param pageContent    网页的内容
     * @return                网页的编码方式
     */
    public static String GetPageCharset(byte[] pageContent){
           CharsetDetector detector = new CharsetDetector();
           detector.setText(pageContent);
           CharsetMatch match = detector.detect();
           return match.getName();            
    }

3. 杂项

    除了以上两个主要的方面,还有一些小方面,包括:

a. 使用httpclient前,先将cookie都设置进去

b. 处理网页前,先检测mime type是不是想要的

c. 使用org.apache.log4j.Logger记录运行中的各种信息,以备不时之需

d. 建立一个enum类,将http code的各种状态进行总结,如OK状态的code从200到299,redirection的状态从300到399

e. 当确定不会改变变量的值时,对其使用final关键字

    

posted @ 2012-08-16 09:35  风中之炎  阅读(4794)  评论(2编辑  收藏  举报