Android Jsoup与HttpClient网络爬虫解析

23 篇文章 0 订阅
11 篇文章 0 订阅


一、Jsoup介绍

    Jsoup是一款Java的HTML解析器,可直接解析某个URL、HTML文本内容。他提供了一套非常具有效率的API,可通过DOM,CSS以及类似于Jquery的操作方法取出和操作数据。包涵支持HTML5的解析器分支,可确保跟现在的浏览器一样解析HTML的方法,同时降低了解析的时间和内存的占用。


主要功能与特点如下:

1.从一个URL,文件或字符串中解析HTML。

2.使用DOM或CSS选择器来查找和取出数据。

3.可操作HTML元素、属性和文本。

4.Jsoup是基于MIT协议发布的,安全性较高。

 

二、HttpClient介绍

    HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,HttpClient提供了很多特性,支持最新的HTTP标准。从名字上可以看出,他是一个简单的HTTP客户端(不是浏览器),可以发送HTTP请求,接收HTTP响应,但不会缓存服务器的响应,不能执行HTTP页面中嵌入的JS代码,自然也不会对页面内容进行解析、处理,这些都是需要开发人员自个儿编码完成。HttpClient的本质是一个模拟浏览器跟服务器通信的工具,他代替了浏览器向服务器发送请求并接收服务器的回应,然后配合Jsoup解析并响应报文,最后抓取到自己需要的东西。


主要功能如下:

1.实现了所有HTTP的方法(GET、POST、PUT和HEAD等)。

2.支持自动转向。

3.支持HTTPS协议。

4.支持代理服务器等。

 


三、Jsoup基本用法

1.在项目工程下添加依赖库。

//Jsoup
compile 'org.jsoup:jsoup:1.9.2'

2.Jsoup方法解析网页。

private void parseHtml() {
    try {
        doc = Jsoup.connect(url).get();
        Elements elements = doc.select("div.unit");
        for (Element ele : elements) {
            String title = ele.getElementsByTag("h1").first().text();
            String href = ele.getElementsByTag("h1").first()
                    .getElementsByTag("a").first().attr("href");
            // logcat中打印出“新闻标题+链接地址”
            Log.i("info", title + ":" + href);
            mListTitle.add(title);
        }
        mListTitle.add(mStrTime);
    } catch (IOException e) {
        e.printStackTrace();
    }
    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, mListTitle);
    hander.post(runnableUi);
}




3.设置主线程更新UI操作。

hander = new Handler();
new Thread(new Runnable() {
    @Override
    public void run() {
        parseHtml();
    }
}).start();


Runnable runnableUi = new Runnable() {
    @Override
    public void run() {
        setListAdapter(mAdapter);
    }
};




4.添加解析时间(纯属用于比较与HttpClient的区别,以时间观察解析速度)。

mFirDate = new Date(System.currentTimeMillis());
timeFirst = mFirDate.getTime();


四、HttpClient基本用法

1.在项目工程下添加依赖库。

//添加HttpClient
useLibrary 'org.apache.http.legacy'

2.异步方式加载数据。

/**
 * 异步方式加载数据
 */
private class RequestTask extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        //在doInBackground方法中,做一些诸如网络请求等耗时操作。
        return RequestData();
    }

    /**
     * onPostExecute方法主要是主线程中的数据更新。
     */
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (result != null) {
            //如果获取的result数据不为空,那么对其进行JSON解析。并显示在手机屏幕上。
            JSONAnalysis(result);
        } else if (result == null) {
            Toast.makeText(HttpClientNetActivity.this, "请求数据失败", Toast.LENGTH_LONG).show();
        }
    }
}




3.请求网络数据,该处使用HttpClient方法。

/**
 * 网络请求,这里用的是HttpClient
 *
 * @return
 */
public String RequestData() {
    HttpGet get = new HttpGet(url);
    HttpClient client = new DefaultHttpClient();
    StringBuilder builder = null;
    try {
        HttpResponse response = client.execute(get);
        if (response.getStatusLine().getStatusCode() == 200) {
            InputStream inputStream = response.getEntity().getContent();
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(inputStream));
            builder = new StringBuilder();
            String s = null;
            for (s = reader.readLine(); s != null; s = reader.readLine()) {
                builder.append(s);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return builder.toString();
}




4.将请求返回的数据进行JSON解析。

/**
 * 对请求回来的数据进行JSON解析。
 *
 * @param result
 */
public void JSONAnalysis(String result) {
    JSONTokener(result);
    Document document = Jsoup.parse(result);
    Elements elements = document.select("div.unit");
    for (Element ele : elements) {
        String title = ele.getElementsByTag("h1").first().text();
        String href = ele.getElementsByTag("h1").first()
                .getElementsByTag("a").first().attr("href");
        // logcat中打印出“新闻标题+链接地址”
        Log.i("info", title + ":" + href);
        mListTitle.add(title);
    }
    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, mListTitle);
    setListAdapter(mAdapter);
}




5.请求返回的HTML文本代码的编码有时会出现问题,这与网页的编码方式有关,我们在此处进行异常处理。

/**
 *解决编码异常问题
 * @param in
 * @return
 */
public String JSONTokener(String in) {
    if (in != null && in.startsWith("\ufeff")) {
        in = in.substring(1);
    }
    return in;
}



6. 添加解析时间(目的同Jsoup,用于比较解析时间)。

mFirDate = new Date(System.currentTimeMillis());
timeFirst = mFirDate.getTime();





五、效果展示

               




六、源码下载

地址:http://download.csdn.net/detail/u012721519/9743735





Good luck!

Write by Jimmy.li

























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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值