热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidJsoup与HttpClient网络爬虫解析

一、Jsoup介绍Jsoup是一款Java的HTML解析器,可直接解析某个URL、HTML文本内容。他提供了一套非常具有效率的API,可通过DOM,CSS以及类似于Jquer


一、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(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 {

@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(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


























推荐阅读
  • Eclipse利用HttpClient 写post和get连接到后台
    文件目录如下:第一个包代码如下:packagecn.itcast.login;importcn.itcast.login.service.DataService;importandroid.ap ... [详细]
  • 本篇文章给大家分享的是有关如何正确的使用HttpClient方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 超文本传输协议HTTP也许是当今互联网上使用的最重要的协议了。尽管java.net包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的功能。HttpClient就 ... [详细]
  • UWP 使用Windows.Web.Http命名空间下的HttpClient使用post方法,上传图片服务器
    1.从相册里面选取图片1<summary>21.1从相册里面选取图片3<summary> ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • Iwishtousestreamsasrecommendedbythejson.netperformancetipsdocumentation,howeverImuna ... [详细]
  • HttpClient作为官方推荐的http客户端,相比之前的WebClient和WebRequest好用了很多,但默认无法为每个请求单独设置超时,只能给HttpClient设置默认 ... [详细]
  • 最近手上在进行一个性能测试项目,脚本是java语言使用httpClient实现http请求。并发用户数线程只有40个,但是服务器端启动的线程出现了400多个,是哪里平白无故出现这么多线程呢?肯定是有问 ... [详细]
  • 如何使用.NET CORE HttpClient
    小编这次要给大家分享的是如何使用.NETCOREHttpClient,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。前 ... [详细]
author-avatar
睿芬惠洁育瑋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有