您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 使用 HttpClient 和 HtmlParser 实现简易爬虫
使用HttpClient和HtmlParser实现简易爬虫级别:初级蒋宏伟(jianghongwei_tju@yahoo.com.cn),在校学生,天津大学计算机学院2008年9月11日这篇文章介绍了HtmlParser开源包和HttpClient开源包的使用,在此基础上实现了一个简易的网络爬虫(Crawler),来说明如何使用HtmlParser根据需要处理Internet上的网页,以及如何使用HttpClient来简化Get和Post请求操作,构建强大的网络应用程序。使用HttpClient和HtmlParser实现简易爬虫这篇文章介绍了HtmlParser开源包和HttpClient开源包的使用,在此基础上实现了一个简易的网络爬虫(Crawler),来说明如何使用HtmlParser根据需要处理Internet上的网页,以及如何使用HttpClient来简化Get和Post请求操作,构建强大的网络应用程序。HttpClient与HtmlParser简介本小结简单的介绍一下HttpClinet和HtmlParser两个开源的项目,以及他们的网站和提供下载的地址。HttpClient简介HTTP协议是现在的因特网最重要的协议之一。除了WEB浏览器之外,WEB服务,基于网络的应用程序以及日益增长的网络计算不断扩展着HTTP协议的角色,使得越来越多的应用程序需要HTTP协议的支持。虽然JAVA类库.net包提供了基本功能,来使用HTTP协议访问网络资源,但是其灵活性和功能远不能满足很多应用程序的需要。而JakartaCommonsHttpClient组件寻求提供更为灵活,更加高效的HTTP协议支持,简化基于HTTP协议的应用程序的创建。HttpClient提供了很多的特性,支持最新的HTTP标准,可以访问这里了解更多关于HttpClinet的详细信息。目前有很多的开源项目都用到了HttpClient提供的HTTP功能,登陆网址可以查看这些项目。本文中使用HttpClinet提供的类库来访问和下载Internet上面的网页,在后续部分会详细介绍到其提供的两种请求网络资源的方法:Get请求和Post请求。Apatche提供免费的HTTPClient源码和JAR包下载,可以登陆这里下载最新的HttpClient组件。笔者使用的是HttpClient3.1。文档选项打印本页这篇文章介绍了使用HttpCliencn将此页作为电子邮件发送回页首HtmlParser简介当今的Internet上面有数亿记的网页,越来越多应用程序将这些网页作为分析和处理的数据对象。这些网页多为半结构化的文本,有着大量的标签和嵌套的结构。当我们自己开发一些处理网页的应用程序时,会想到要开发一个单独的网页解析器,这一部分的工作必定需要付出相当的精力和时间。事实上,做为JAVA应用程序开发者,HtmlParser为其提供了强大而灵活易用的开源类库,大大节省了写一个网页解析器的开销。HtmlParser是上活跃的一个开源项目,它提供了线性和嵌套两种方式来解析网页,主要用于html网页的转换(Transformation)以及网页内容的抽取(Extraction)。HtmlParser有如下一些易于使用的特性:过滤器(Filters),访问者模式(Visitors),处理自定义标签以及易于使用的JavaBeans。正如HtmlParser首页所说:它是一个快速,健壮以及严格测试过的组件;以它设计的简洁,程序运行的速度以及处理Internet上真实网页的能力吸引着越来越多的开发者。本文中就是利用HtmlParser里提取网页里的链接,实现简易爬虫里的关键部分。HtmlParser最新的版本是HtmlParser1.6,可以登陆这里下载其源码、API参考文档以及JAR包。开发环境的搭建笔者所使用的开发环境是EclipseEuropa,此开发工具可以在免费的下载;JDK是1.6,你也可以在站点下载,并且在操作系统中配置好环境变量。在Eclipse中创建一个JAVA工程,在工程的BuildPath中导入下载的Commons-httpClient3.1.Jar,htmllexer.jar以及htmlparser.jar文件。图1.开发环境搭建回页首HttpClient基本类库使用HttpClinet提供了几个类来支持HTTP访问。下面我们通过一些示例代码来熟悉和说明这些类的功能和使用。HttpClient提供的HTTP的访问主要是通过GetMethod类和PostMethod类来实现的,他们分别对应了HTTPGet请求与HttpPost请求。GetMethod使用GetMethod来访问一个URL对应的网页,需要如下一些步骤。1.生成一个HttpClinet对象并设置相应的参数。2.生成一个GetMethod对象并设置响应的参数。3.用HttpClinet生成的对象来执行GetMethod生成的Get方法。4.处理响应状态码。5.若响应正常,处理HTTP响应内容。6.释放连接。回页首清单1的代码展示了这些步骤,其中的注释对代码进行了较详细的说明。清单1./*1生成HttpClinet对象并设置参数*/HttpClienthttpClient=newHttpClient();//设置Http连接超时为5秒httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);/*2生成GetMethod对象并设置参数*/GetMethodgetMethod=newGetMethod(url);//设置get请求超时为5秒getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT,5000);//设置请求重试处理,用的是默认的重试处理:请求三次getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,newDefaultHttpMethodRetryHandler());/*3执行HTTPGET请求*/try{intstatusCode=httpClient.executeMethod(getMethod);/*4判断访问的状态码*/if(statusCode!=HttpStatus.SC_OK){System.err.println(Methodfailed:+getMethod.getStatusLine());}/*5处理HTTP响应内容*///HTTP响应头部信息,这里简单打印Header[]headers=getMethod.getResponseHeaders();for(Headerh:headers)System.out.println(h.getName()++h.getValue());*///读取HTTP响应内容,这里简单打印网页内容byte[]responseBody=getMethod.getResponseBody();//读取为字节数组System.out.println(newString(responseBody));//读取为InputStream,在网页内容数据量大时候推荐使用InputStreamresponse=getMethod.getResponseBodyAsStream();//…}catch(HttpExceptione){//发生致命的异常,可能是协议不对或者返回的内容有问题System.out.println(Pleasecheckyourprovidedhttpaddress!);e.printStackTrace();}catch(IOExceptione){//发生网络异常e.printStackTrace();}finally{/*6.释放连接*/getMethod.releaseConnection();}这里值得注意的几个地方是:1.设置连接超时和请求超时,这两个超时的意义不同,需要分别设置。2.响应状态码的处理。3.返回的结果可以为字节数组,也可以为InputStream,而后者在网页内容数据量较大的时候推荐使用。在处理返回结果的时候可以根据自己的需要,进行相应的处理。如笔者是需要保存网页到本地,因此就可以写一个saveToLocaleFile(byte[]data,StringfilePath)的方法,将字节数组保存成本地文件。后续的简易爬虫部分会有相应的介绍。PostMethodPostMethod方法与GetMethod方法的使用步骤大体相同。但是由于PostMethod使用的是HTTP的Post请求,因而请求参数的设置与GetMethod有所不同。在GetMethod中,请求的参数直接写在URL里,一般以这样形式出现:=value1&name2=value…。请求参数是name,value对。比如我想得到百度搜索“ThinkingInJava”的结果网页,就可以使GetMethod的构造方法中的url为:=Thinking+In+Java。而PostMethod则可以模拟网页里表单提交的过程,通过设置表单里post请求参数的值,来动态的获得返回的网页结果。清单2中的代码展示了如何创建一个Post对象,并设置相应的请求参数。清单2PostMethodpostMethod=newPostMethod();postMethod.setRequestBody(newNameValuePair[]{newNameValuePair(q,java)});HtmlParser基本类库使用HtmlParser提供了强大的类库来处理Internet上的网页,可以实现对网页特定内容的提取和修改。回页首下面通过几个例子来介绍HtmlParser的一些使用。这些例子其中的代码,有部分用在了后面介绍的简易爬虫中。以下所有的代码和方法都在在类HtmlParser.Test.java里,这是笔者编写的一个用来测试HtmlParser用法的类。迭代遍历网页所有节点网页是一个半结构化的嵌套文本文件,有类似XML文件的树形嵌套结构。使用HtmlParser可以让我们轻易的迭代遍历网页的所有节点。清单3展示了如何来实现这个功能。清单3//循环访问所有节点,输出包含关键字的值节点publicstaticvoidextractKeyWordText(Stringurl,Stringkeyword){try{//生成一个解析器对象,用网页的url作为参数Parserparser=newParser(url);//设置网页的编码,这里只是请求了一个gb2312编码网页parser.setEncoding(gb2312);//迭代所有节点,null表示不使用NodeFilterNodeListlist=parser.parse(null);//从初始的节点列表跌倒所有的节点processNodeList(list,keyword);}catch(ParserExceptione){e.printStackTrace();}}privatestaticvoidprocessNodeList(NodeListlist,Stringkeyword){//迭代开始SimpleNodeIteratoriterator=list.elements();while(iterator.hasMoreNodes()){Nodenode=iterator.nextNode();//得到该节点的子节点列表NodeListchildList=node.getChildren();//孩子节点为空,
本文标题:使用 HttpClient 和 HtmlParser 实现简易爬虫
链接地址:https://www.777doc.com/doc-4344803 .html