Thursday, December 10, 2009

自己动手做爬虫

 
 

Sent to you by tony via Google Reader:

 
 

via 玩聚SR|最佳 by Sun 中国技术社区 专家博客 on 12/8/09

玩聚SR还知道:
入门级?
Sun 中国技术社区 专家博客发表于2009-12-08 16:30:13

自己动手做爬虫

作者:曹祺
Blog: http://blogs.sun.com/greysh
Web: http://www.greysh.com
Email: Qi.Cao@Sun.com
本文链接:
http://developers.sun.com.cn/blog/functionalca/entry/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%81%9A%E7%88%AC%E8%99%AB

工程下载: 
http://developers.sun.com.cn/blog/functionalca/resource/Greysh/FCA_Greysh_HC.zip

难度:入门

摘要
做一个全文搜索引擎,需要完成数据采集,自然语言处理,搜索,结果排序,结果呈现等几个步骤,本文主要介绍如何用apache的HttpComponents和HtmlParser,自己做一个搜索引擎采集功能部分。

 

所需要的jar包主要是HttpComponents和htmlparser,可以在http://hc.apache.org/http://htmlparser.sourceforge.net/下载

爬虫简单的说,就是将互联网的数据下载到硬盘,然后主要考虑的问题有如何提高抓取速度,如何并发下载,有些时候互联网的超链接之间会形成图,或者是树,如何控制图和树的遍历都是很重要的问题,以及如何控制好文件的存储,尽可能用少的磁盘空间存储更多的内容,有时还要考虑一些已有的协议,如robots协议。

爬虫主要工作流程如下:

1)外部给爬虫一个种子,最好是网址之家,比如hao123.com,本文的教程主要采用www.apche.org
2)当爬虫把www.apache.org的页面下载下来后,如何自动的从这个页面去寻找下一个链接的起始位置呢?这个时候就需要分析html文件,尤其是以<a href>开头的超链接,当然可以自己写抓取的自动机
3)将超链接缓存下来然后把这些超链接作为种子继续向下找, 本教程主要介绍流程,因此如何控制超链接图和树的遍历就不赘述了

具体代码分析如下

首先打开一个网页进行下载,虽然网页简单的下载可以直接写socket访问80端口,但是apache的HttpComponents封装了很多其他的访问方式,比如SSL,还有FORM提交后的响应,httpComponents并不是一个浏览器,它确实JavaScript引擎,HTML呈现器等浏览器必备部分。

public static String crawl(String url) throws IOException, ClientProtocolException {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String html = null;
try {
html = httpclient.execute(httpget, responseHandler);
} catch (HttpHostConnectException e) {
httpget.abort();//中断访问
}
httpclient.getConnectionManager().shutdown();//关闭访问
return html;
}

使用起来很简单,但是要注意的是,很多网页在国内无法访问,如果不用httpget.abort();会造成链接超时

页面下载下来后进行遍历,本教程主要是从apache抓取首页后,根据apache 2级项目的url继续抓取二级页面,得到首页的html后,就需要用htmlparser进行分析,htmlparser的流程如下

创建制定字符集的Parser,然后创建标签过滤器,分析的指定的Page,会把html生成一棵树,接着就可以采用类似SAX或者DOM的方式访问节点,访问的时候可以定位到html所在的行和列,也可以自己扩展标签,非常强大。
具体代码如下:
Parser parser = Parser.createParser(html, "ISO-8859-1");
HtmlPage page = new HtmlPage(parser);
parser.visitAllNodesWith(page);
NodeList nodelist = page.getBody();
NodeFilter filter = new TagNameFilter("a");
nodelist = nodelist.extractAllNodesThatMatch(filter, true);
for (int i = 0; i < nodelist.size(); i++) {
LinkTag link = (LinkTag) nodelist.elementAt(i);
String url = checkParentUrl(link.extractLink());

关于具体的apache网站的网址的处理和性能比较见本文工程,运行的性能更网速,机器硬件很多相关,在本人机器上的性能测试结果如下


本文测试环境是:
OS:Windows Vista Buisness
内存:3G
JDK:java version "1.7.0-ea"
带宽:中国电信1M带宽


-----------parentUrlList Starts---------
--打印访问的首页
-----------parentUrlList Ends ---------

-----------It costs:2710ms ---------

-----------childUrlList Starts---------
--打印访问的二级页面
-----------childUrlList Ends---------
-----------It costs:10671ms ---------

读者感兴趣可以去www.open-open.com或者opensource.csdn.net使用一下比较著名的爬虫,比如Heritrix,Web-Harvest

玩聚SR 是一个追踪各种社会化媒体,实时发现IT人都在分享和推荐什么的工具。点击阅读科技频道热文。
手机请登录移动版

 
 

Things you can do from here:

 
 

No comments:

Post a Comment