最近想做一个爬虫工具,看了下相关的资料,现在简单介绍下两个重要的开源组件--HttpClient和HtmlClient,如下
1、HttpClient是apache的一个开源项目,可以功能丰富而且高效的支持http协议客户端编程工具,实现了各种基于http的交互,包括GET、POST、PUT、HEAD等方式,而且追踪自动转向(也就是所谓的redirect,forward等),支持https协议(一种基于http协议,但比http协议安全,即加密了),而且支持代理(请求或接受数据的时候,可以指定代理服务器)等,最常用的功能。、
2、HtmlParser,即Html Parser,它可以高效、准确的分析你的HTML代码,有了HttpClient之后,抓取网页内容就不是问题了,抓取不是目的,落地的数据处理才是关键,比如,提取title,分析body正文,以及关键字等,都需要在处理html的标签的基础上去做,HtmlParser就是做这个的。
至于它们的下载就不多说了吧,下面简单的给两个demo:

(1)用HtmlParser下载网页源码内容 

 public void testGetSource(){ 

   HttpClient client=new DefaultHttpClient();//取得httpClient默认的httpClient 

    

   HttpGet httpGet=new HttpGet("一个基于Http的get请求 

   HttpResponse response=null; 

   try { 

    response=client.execute(httpGet);//用httpClient发送httGet请求,相当于你在地址栏中输入http://www.baidu.com/ 

                                     //response相当于你的所返回结合的一个集合,包括返回的一切信息 

   } catch (ClientProtocolException e) { 

    e.printStackTrace(); 

   } catch (IOException e) { 

    e.printStackTrace(); 

   } 

   HttpEntity entity=response.getEntity();//得到结果的主要内容 

   InputStream ins=null; 

   try { 

    ins=entity.getContent();//取得内容的输出流 

   } catch (IllegalStateException e) { 

    e.printStackTrace(); 

   } catch (IOException e) { 

    e.printStackTrace(); 

   } 

   String pageCharSet=EntityUtils.getContentCharSet(entity);//通过EntitiUtils工具类,可以得到所请求页面的编码charset,是为传输数据做准备, 

                  //如果charset不对应的话,很容易出现乱码 

   BufferedReader br=null;                                                   

   try { 

    br=new BufferedReader(new InputStreamReader(ins,pageCharSet));//用缓冲流做为输出流,方便处理 

    String lineString=""; 

    while((lineString=br.readLine())!=null){ 

     System.out.println(lineString);//输出到命令行 

    } 

    br.close();//关闭两个流 

    ins.close(); 

   } catch (UnsupportedEncodingException e) { 

    e.printStackTrace(); 

   } catch (IOException e) { 

    e.printStackTrace(); 

   } 

  } 

 (2)用HtmlParser得到所有该html的所有链接 

         第一种简单方法: 

               public void testGetByLinkBeans() throws IOException { 

   LinkBean bean = new LinkBean();//link的一个专用处理类 

   bean.setURL("以百度网址为处理对象 

   URL[] urls = bean.getLinks();//得到百度的链接集合 

   for (int i = 0; i < urls.length; i++) { 

    System.out.println("toString is : " + urls[i].toString());//将每个链接列出来 

   } 

  } 

   第二种是用过滤器的方式, 

     public void testGetLinksAndText(){ 

   SimpleClient client=new SimpleClient(url);//可以认为是httpClient,也就是第一个demo例子中的httpClient 

   String htmlString=client.getHtmlString();//也就是取得源码 

    

   Parser parser=Parser.createParser(htmlString,client.getPageCharSet());//用源码和页面的字符编码初始化一个Parser处理器 

   HtmlPage page=new HtmlPage(parser);//htmlPage相当于parser处理后得到的结果页 

    

   try { 

    parser.visitAllNodesWith(page);//真正去遍历下htmlString的标签 

   } catch (ParserException e) { 

    e.printStackTrace(); 

   } 

   NodeList nodeList=page.getBody();//得到html源码的body内容 

    

   NodeFilter filter=new TagNameFilter("A");//加一个NameTag过滤器,即用“A”超链接去过滤下nodeList,即只要"A"标答的内容 

   nodeList=nodeList.extractAllNodesThatMatch(filter);//真正去过滤 

    

   for(int i=0;i<nodeList.size();i++){//编历得到的所有“A”标签 

    LinkTag link=(LinkTag)nodeList.elementAt(i);//取得每一个link 

 //   link. 

    System.out.println("link-"+(i+1)+":"+link.getLink()+" : "+link.getLinkText());//将href和link里的链接串都列出来 

   } 

  }


很显然,第二种比第一种要麻烦些,但是由于目的不一样,采取的方法也就不一样了。就介绍到这吧。