基于关键词的博客搜索

程序的关键部分基本完成了,先停下来吧,如果朋友有什么要求,再继续写。
总体的设计就是3部分,

  1. 根据输入的博客地址去抓取博客
    这里和我一开始的构思有点不同。因为这里的应用比较具体,只需要搜索某个人的博客内容,所以,我只需要抓取博客的html,其余的网页内容可以忽略。所以,这里我不需要用那些通用的网页爬虫,或者说不能用那些通用的网页爬虫,因为不满足我的需求。要做通用的博客抓取并不容易,我需要根据各个博客的不同情况来抓取博客。现在实现了baidu,sina,sohu三种博客的抓取。
    基本的博客下载流程:
    1. 分析博客地址的正确性,初始化用户名,本地存放路径,博客系统所用编码等信息。
    2. 分析博客索引页面的页面数目。一般的博客系统页面上都会有页面列出此博客的所有文章,而一页显示不完的时候需要有多页显示。这其中的每一页就是博客索引页面。程序首先要分析出博客索引页面一共有多少页。
    3. 得到索引页面数之后,就可以根据规则构造出所有的博客索引页面网址。
      比 如百度的就很简单,http://hi.baidu.com/$username/blog/index/$i,但是这个页面有很多冗余的内容,比如部分 的博客内容。sina的就好一点,有个xml的,http://blog.sina.com.cn/sns/service.php?m= aList&uid=$uid&sort_id=0&page=$i
    4. 在索引页面分析出所有博客文章的网址,然后下载所有的博客html。
  2. 建立索引
    下载完博客之后,就可以建立索引然后搜索了,用到了lucene。真是太好用了。而且对于简单的应用需求,我不需要去考虑复杂的中文分词。我用了一种基于词库的分词方法,做了小改动,只对词库中有的词进行索引,不在词库中的词都忽略掉。同时,建立索引的时候需要保存关键词在文章中出现的频率,因为搜索的时候要用到。
  3. 搜索
    输入词库中存在的关键词进行搜索。输出的结果就是一篇篇的博客,对于每篇博客,都同时输出关键词在这篇博客里面出现的次数。次数是在IndexReader里面可以得到的。这里并没有实现最终的需求,只能搜索一个关键词,而且没有根据关键词出现的次数进行结果过滤。不过,要实现的话应该不难,先放着了。

收获:

良好的框架设计很重要。比如博客抓取,每种博客都有各自特殊的情况,但又有共通的部分,流程基本是固定的。我在基类里面写好流程,调用抽象方法去做实际的事情。那么在各个具体的博客抓取类中,只需要实现这些抽象方法就行了。由于在基类里面细分的很好,每个抽象方法要做的事情都很简单,明确,方法之间关联不大。这样写起代码来也很方便。所以扩展博客抓取的功能也就比较容易。

最后,lucene真的很好用。

Comments