`
playfish
  • 浏览: 290301 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

HttpClient+Jericho HTML Parser 实现网页的抓取

    博客分类:
  • Java
阅读更多
Jericho HTML Parser是一个简单而功能强大的Java HTML解析器库,可以分析和处理HTML文档的一部分,包括一些通用的服务器端标签,同时也可以重新生成无法识别的或无效的HTML。它也提供了一个有用的HTML表单分析器。
  下载地址:http://sourceforge.net/project/showfiles.php?group_id=101067

  HttpClient作为HTTP客户端组件与服务器进行通讯,同时使用了jdom进行XML数据的解析。

    * HttpClient 可以在http://jakarta.apache.org/commons/httpclient/downloads.html下载
    * HttpClient 用到了 Apache Jakarta common 下的子项目 logging,你可以从这个地址http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi下载到 common logging,从下载后的压缩包中取出 commons-logging.jar 加到 CLASSPATH 中
    * HttpClient 用到了 Apache Jakarta common 下的子项目 codec,你可以从这个地址http://jakarta.apache.org/site/downloads/downloads_commons-codec.cgi 下载到最新的 common codec,从下载后的压缩包中取出 commons-codec-1.x.jar 加到 CLASSPATH 中


在对网页信息进行抓取时,主要会用到GET 方法

使用 HttpClient 需要以下 6 个步骤:

1. 创建 HttpClient 的实例

2. 创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址

3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例

4. 读 response

5. 释放连接。无论执行方法是否成功,都必须释放连接

6. 对得到后的内容进行处理
在eclipse下建立工程 -->snatch
将上面下载的四个jar文件导入到项目路径中.
环境搭建完成

现在,首先介绍一下HttpClient的使用
在工程目录下创建test包,在包中创建Httpclient Test类

package test;
import java.io.IOException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
public class HttpClientTest...{
  public static void main(String[] args) {
  //构造HttpClient的实例
  HttpClient httpClient = new HttpClient();
  //创建GET方法的实例
  GetMethod getMethod = new GetMethod("http://www.google.com.cn");
  //使用系统提供的默认的恢复策略
  getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
    new DefaultHttpMethodRetryHandler());
  try {
   //执行getMethod
   int statusCode = httpClient.executeMethod(getMethod);
   if (statusCode != HttpStatus.SC_OK) {
    System.err.println("Method failed: "
      + getMethod.getStatusLine());
   }
   //读取内容 
   byte[] responseBody = getMethod.getResponseBoy();
   //处理内容
   System.out.println(new String(responseBody));
  } catch (HttpException e) {
   //发生致命的异常,可能是协议不对或者返回的内容有问题
   System.out.println("Please check your provided http address!");
   e.printStackTrace();
  } catch (IOException e) {
   //发生网络异常
   e.printStackTrace();
  } finally {
   //释放连接
   getMethod.releaseConnection();
  }
 }
}


这样得到的是页面的源代码.
这里 byte[] responseBody = getMethod.getResponseBoy();是读取内容
除此之外,我们还可以这样读取:
InputStream inputStream=   getMethod.getResponseBodyAsStream();
String responseBody = getMethod.getResponseBodyAsString();


下面结合两者给个事例
取出http://www.ahcourt.gov.cn/gb/ahgy_2004/fyxw/index.html
中"信息快递"栏的前几条信息.
新建类CourtNews
package test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

import au.id.jericho.lib.html.Element;
import au.id.jericho.lib.html.HTMLElementName;
import au.id.jericho.lib.html.Segment;
import au.id.jericho.lib.html.Source;

/** *//**
 * @author oscar 07-5-17
 * 
 */
public class CourtNews {
    private int newsCount = 3;

    private List newsList = new ArrayList();

    public int getNewsCount() {
        return newsCount;
    }

    public void setNewsCount(int newsCount) {
        this.newsCount = newsCount;
    }

    public List getNewsList() {
        HttpClient httpClient = new HttpClient();
        GetMethod getMethod = new GetMethod(
                "http://www.ahcourt.gov.cn/gb/ahgy_2004/fyxw/index.html");
        getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                new DefaultHttpMethodRetryHandler());

        try {
            int statusCode = httpClient.executeMethod(getMethod);
            if (statusCode != HttpStatus.SC_OK) {
                System.err
                        .println("Method failed:" + getMethod.getStatusLine());
            }

            String responseBody = getMethod.getResponseBodyAsString();
            responseBody = new String(responseBody.getBytes("ISO-8859-1"),
                    "GB2312");
            Source source = new Source(responseBody);

            int tableCount = 0;

            for (Iterator i = source.findAllElements(HTMLElementName.TABLE)
                    .iterator(); i.hasNext(); tableCount++) {

                Segment segment = (Segment) i.next();

                if (tableCount == 13) {

                    int hrefCount = 0;
                    for (Iterator j = segment
                            .findAllElements(HTMLElementName.A).iterator(); j
                            .hasNext();) {
                        Segment childsegment = (Segment) j.next();
                        String title = childsegment.extractText();
                        title.replace(" ", " ");
                        title = trimTitle(title);
                        Element childelement = (Element) childsegment;
                        if (hrefCount < newsCount) {

                            String[] news = new String[] {
                                    title,
                                    "http://www.ahcourt.gov.cn"
                                            + childelement
                                                    .getAttributeValue("href") };
                            newsList.add(news);
                            hrefCount++;
                        }
                    }

                }
            }
        } catch (HttpException e) {
            System.out.println("please check your provided http address!");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            getMethod.releaseConnection();
        }
        return newsList;
    }

    private String trimTitle(String title) {
        String titlenew = "";

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

            if (Character.isSpaceChar(title.charAt(i)))
                titlenew += " ";
            else {
                titlenew += title.charAt(i);
            }

        }
        return titlenew;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        CourtNews justice = new CourtNews();
        justice.setNewsCount(4);
        List list = justice.getNewsList();
        Iterator it = list.iterator();
        while (it.hasNext()) {
            String[] news = (String[]) it.next();
            System.out.println(news[0]);
            System.out.println(news[1]);
    }
    }

}
分享到:
评论
3 楼 lord_is_layuping 2012-02-22  
Jericho
2 楼 wxq594808632 2011-01-10  
看到你在
http://liu208286.iteye.com/blog/267384
评论说抓取javaeye正文一句代码就搞定..
求解.
1 楼 kele8boy 2008-06-27  
人家用了robots

相关推荐

    基于SSM+maven+httpClient+jsoup实现小说网站项目.zip

    基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+...

    基于SSM+maven+httpClient+jsoup实现小说网站项目源码.zip

    基于SSM+maven+httpClient+jsoup实现小说网站项目源码.zip 基于SSM+maven+httpClient+jsoup实现小说网站项目源码.zip 基于SSM+maven+httpClient+jsoup实现小说网站项目源码.zip 基于SSM+maven+httpClient+jsoup实现...

    Httpclient+testng接口测试小例子

    在"Httpclient+testng接口测试小例子"中,我们将使用以下步骤进行接口测试: 1. **环境准备**:首先,确保项目中已经添加了Apache HttpClient和TestNG的依赖。这些通常通过Maven或Gradle等构建工具进行管理,通过在...

    httpClient+jsoup 抓取网页数据

    HttpClient和Jsoup是两个Java库,分别专注于HTTP通信和HTML解析,它们常被组合使用来高效地抓取网页数据。下面我们将详细探讨这两个库及其在网页抓取中的应用。 HttpClient是由Apache软件基金会开发的一个库,主要...

    httpClient+jsoup抓取网页数据实例和jar包

    在IT领域,网络爬虫是获取网页数据的重要手段,而HttpClient和Jsoup是两种常用的Java库,用于实现这一目的。HttpClient提供了低级别的HTTP通信能力,而Jsoup则是一个解析和操作HTML文档的强大工具。本教程将详细介绍...

    基于SSM+maven+httpClient+jsoup实现的java爬虫项目,一个完整的小说网站高分项目+详细文档+全部资料.zip

    基于SSM+maven+httpClient+jsoup实现的java爬虫项目,一个完整的小说网站高分项目+详细文档+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都...

    基于SSM+maven+httpClient+jsoup实现的java爬虫项目,一个完整的小说网站.zip

    【标题】中的“基于SSM+maven+httpClient+jsoup实现的java爬虫项目”揭示了这个Java项目的核心技术和用途。下面将详细解释这些技术及其在项目中的作用: 1. **SSM框架**:SSM是Spring、SpringMVC和MyBatis的缩写,...

    HttpClient+ Spring实现多线程

    标题 "HttpClient + Spring 实现多线程" 涉及到的是如何在Spring框架中使用Apache HttpClient库来创建一个支持多线程的HTTP客户端服务。Apache HttpClient是一个强大的HTTP客户端API,它提供了丰富的功能来处理HTTP...

    HTTPClient + MQ + servlet

    使用HTTPClient,开发者可以构建客户端应用,与远程服务进行数据交换,实现如API调用等功能。 其次,**MQ(Message Queue)**是消息中间件,它的主要作用是在不同的应用程序之间传递消息。在Java中,常见的MQ实现有...

    爬虫:httpclient+jsoup

    在IT领域,网络爬虫是一种自动化程序,用于从...总之,HttpClient和Jsoup是Java爬虫开发中的两个强大工具,它们结合使用能有效地抓取和解析网页信息。理解它们的工作原理和用法,对于构建高效的网络爬虫至关重要。

    jsoup+httpclient+jar包

    HttpClient与JSoup结合使用,可以实现更高级的网页访问和数据获取。 **结合使用JSoup和HTTPClient** 将JSoup与HTTPClient结合,可以创建一个高效且灵活的网页爬虫。首先,HTTPClient负责发起HTTP请求,获取网页的...

    httpclient+knife4j.zip

    这个压缩包"HTTPClient+Knife4J"很可能是为了演示如何在SpringBoot项目中使用HttpClient进行网络请求,并结合Knife4J生成文档。开发者可以下载解压后,查看源代码学习如何整合这两个组件,理解它们在实际项目中的...

    HttpClient抓取网页Demo

    在本文中,我们将深入探讨HttpClient的基本用法,以及如何使用它来抓取网页内容。 首先,你需要在项目中引入HttpClient的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org....

Global site tag (gtag.js) - Google Analytics