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

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类

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();
        //设置代理服务器地址和端口
        httpClient.getHostConfiguration().setProxy("90.0.12.21",808);
        //创建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.getResponseBody();
            //处理内容
            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

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();  
        //设置代理服务器地址和端口
        httpClient.getHostConfiguration().setProxy("90.0.12.21",808);
        //使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成https
        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]);  
    }  
    }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷月宫主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值