`

Android 网页抓取(实现新闻客户端)

 
阅读更多
如何实现从各大网抓取新闻并经过格式处理现实到我们的新闻客户端呢?
Android客户端抓取并解析网页的方法我用到的有两种:
一、用jsoup
没仔细研究,网上有类似的,可以参考这两位兄弟的:
http://decentway.iteye.com/blog/1333127
http://blog.csdn.net/hellohaifei/article/details/9352069

二、用htmlparser
我项目中就用htmlparser,抓紧并解析腾讯新闻,代码如下:

public class NetUtil {
	public static List<NewsBrief> DATALIST = new ArrayList<NewsBrief>();

	public static String[][] CHANNEL_URL = new String[][] {
		new String[]{"http://news.qq.com/world_index.shtml","http://news.qq.com"},
		new String[]{"http://news.qq.com/china_index.shtml","http://news.qq.com"},
		new String[]{"http://news.qq.com/society_index.shtml","http://news.qq.com"},
		new String[]{"http://news.qq.com/china_index.shtml","http://news.qq.com"},
		new String[]{"http://news.qq.com/china_index.shtml","http://news.qq.com"},
		new String[]{"http://news.qq.com/china_index.shtml","http://news.qq.com"},
		new String[]{"http://news.qq.com/china_index.shtml","http://news.qq.com"},
		new String[]{"http://news.qq.com/china_index.shtml","http://news.qq.com"},
		new String[]{"http://news.qq.com/china_index.shtml","http://news.qq.com"},
		new String[]{"http://news.qq.com/china_index.shtml","http://news.qq.com"},
		new String[]{"http://news.qq.com/china_index.shtml","http://news.qq.com"},
	};

	public static int getTechNews(List<NewsBrief> techData, int cId) {
		int result = 0;
		try {
			NodeFilter filter = new AndFilter(new TagNameFilter("div"),
					new HasAttributeFilter("id", "listZone"));
			Parser parser = new Parser();
			parser.setURL(CHANNEL_URL[cId][0]);
			parser.setEncoding(parser.getEncoding());
			
			NodeList list = parser.extractAllNodesThatMatch(filter);
			for (int i = 0; i < list.size(); i++) {
				Tag node = (Tag) list.elementAt(i);
				for (int j = 0; j < node.getChildren().size(); j++) {
					try {
						String textstr = node.getChildren().elementAt(j).toHtml();
						if (textstr.trim().length() > 0) {
							NodeFilter subFilter = new TagNameFilter("p");
							Parser subParser = new Parser();
							subParser.setResource(textstr);
							NodeList subList = subParser.extractAllNodesThatMatch(subFilter);

							NodeFilter titleStrFilter = new AndFilter(new TagNameFilter("a"),
									new HasAttributeFilter("class", "linkto"));
							Parser titleStrParser = new Parser();
							titleStrParser.setResource(textstr);
							NodeList titleStrList = titleStrParser.extractAllNodesThatMatch(titleStrFilter);

							int linkstart = titleStrList.toHtml().indexOf("href=\"");
							int linkend = titleStrList.toHtml().indexOf("\">");
							int titleend = titleStrList.toHtml().indexOf("</a>");
							
							String link = CHANNEL_URL[cId][1]+titleStrList.toHtml().substring(linkstart+6, linkend);
							String title = titleStrList.toHtml().substring(linkend+2, titleend);
							
							NewsBrief newsBrief = new NewsBrief();
							newsBrief.setTitle(title);
							newsBrief.setUrl(link);
							newsBrief.setSummary(subList.asString());
							techData.add(newsBrief);
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		} catch (Exception e) {
			result = 1;
			e.printStackTrace();
		}
		return result;
	}

	public static int getTechNews2(List<NewsBrief> techData, int cId) {
		int result = 0;
		try {
			// 查询http://tech.qq.com/tech_yejie.htm 页面 滚动新闻的 标签 以及ID
			NodeFilter filter = new AndFilter(new TagNameFilter("div"),
					new HasAttributeFilter("id", "listZone"));
			Parser parser = new Parser();
			parser.setURL(CHANNEL_URL[cId][0]);
			parser.setEncoding(parser.getEncoding());
			
			// 获取匹配的fileter的节点
			NodeList list = parser.extractAllNodesThatMatch(filter);
			StringBuilder NewsStr = new StringBuilder("<table>");// 新闻表格字符串
			for (int i = 0; i < list.size(); i++) {
				Tag node = (Tag) list.elementAt(i);
				for (int j = 0; j < node.getChildren().size(); j++) {
					String textstr = node.getChildren().elementAt(j).toHtml()
							.trim();
					if (textstr.length() > 0) {
						int linkbegin = 0, linkend = 0, titlebegin = 0, titleend = 0;
						while (true) {
							linkbegin = textstr.indexOf("href=", titleend);// 截取链接字符串起始位置

							// 如果不存在 href了 也就结束了
							if (linkbegin < 0)
								break;

							linkend = textstr.indexOf("\">", linkbegin);// 截取链接字符串结束位置
							String sublink = textstr.substring(linkbegin + 6,linkend);
							String link = CHANNEL_URL[cId][1] + sublink;
							
							titlebegin = textstr.indexOf("\">", linkend);
							titleend = textstr.indexOf("</a>", titlebegin);
							String title = textstr.substring(titlebegin + 2,titleend);

							NewsStr.append("\r\n<tr>\r\n\t<td><a target=\"_blank\" href=\""
									+ link + "\">");
							NewsStr.append(title);
							NewsStr.append("</a></td></tr>");

							NewsBrief newsBrief = new NewsBrief();
							newsBrief.setTitle(title);
							newsBrief.setUrl(link);
							techData.add(newsBrief);
						}
					}
				}
			}
		} catch (Exception e) {
			result = 1;
			e.printStackTrace();
		}
		return result;
	}
	
	public static int parserURL(String url,NewsBrief newsBrief) {
		int result = 0;
		try {
			Parser parser = new Parser(url);
			NodeFilter contentFilter = new AndFilter(
					new TagNameFilter("div"),
					new HasAttributeFilter("id","Cnt-Main-Article-QQ"));
			NodeFilter newsdateFilter = new AndFilter(
					new TagNameFilter("span"),
					new HasAttributeFilter("class",
							"article-time"));
			NodeFilter newsauthorFilter = new AndFilter(
					new TagNameFilter("span"),
					new HasAttributeFilter("class",
							"color-a-1"));
			NodeFilter imgUrlFilter = new TagNameFilter("IMG");
			
			newsBrief.setContent(parserContent(contentFilter,parser));
			parser.reset(); // 记得每次用完parser后,要重置一次parser。要不然就得不到我们想要的内容了。
			
			newsBrief.setPubDate(parserDate(newsdateFilter,parser));
			parser.reset();
			
			newsBrief.setSource(parserAuthor(newsauthorFilter, parser));
			parser.reset();
			
			newsBrief.setImgUrl(parserImgUrl(contentFilter,imgUrlFilter, parser));
			
		} catch (Exception e) {
			result=1;
			e.printStackTrace();
		}
		return result;
	}

	private static String parserContent(NodeFilter filter, Parser parser) {
		String reslut = "";
		try {
			NodeList contentList = (NodeList) parser.parse(filter);
			// 将DIV中的标签都 去掉只留正文
			reslut = contentList.asString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return reslut;
	}

	private static String parserDate(NodeFilter filter, Parser parser) {
		String reslut = "";
		try {
			NodeList datetList = (NodeList) parser.parse(filter);
			// 将DIV中的标签都 去掉只留正文
			reslut = datetList.asString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return reslut;
	}


	private static String parserAuthor(NodeFilter filter, Parser parser) {
		String reslut = "";
		try {
			NodeList authorList = (NodeList) parser.parse(filter);
			// 将DIV中的标签都 去掉只留正文
			reslut = authorList.asString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return reslut;
	}

	private static List<String> parserImgUrl(NodeFilter bodyfilter,NodeFilter filter, Parser parser) {
		List<String> reslut = new ArrayList<String>();
		try {
			NodeList bodyList = (NodeList) parser.parse(bodyfilter);
			Parser imgParser = new Parser();
			imgParser.setResource(bodyList.toHtml());
			NodeList imgList = imgParser.extractAllNodesThatMatch(filter);
			String bodyString = imgList.toHtml();

			//正文包含图片
			if (bodyString.contains("<IMG")
					&& bodyString.contains("src=")) {
				if(imgList.size()>0){
					for(int i=0;i<imgList.size();i++){
						String imgString = imgList.elementAt(i).toHtml();
						int imglinkstart = imgString.indexOf("src=\"");
						int imglinkend = imgString.indexOf(">");
						if(imgString.contains("\" alt=")){
							imglinkend = imgString.indexOf("\" alt=");
						}
						if(imgString.contains("_fck")){
							imglinkend = imgString.indexOf("_fck");// 截取链接字符串结束位置
						}
						reslut.add(imgString.substring(imglinkstart + 5, imglinkend));
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return reslut;
	}
}


附件为用到的jar包;
关于新闻完整的新闻客户端,有需要的哥们可以留下邮箱,完整实现了新闻的抓取:





工程源码在:https://github.com/gqdy365/onlineNews
  • 大小: 113.1 KB
  • 大小: 124.7 KB
10
0
分享到:
评论
54 楼 shujen 2016-01-08  
兄弟大神,求份代码学习。新手。麻烦1583196889@qq.com   敬候,谢谢
53 楼 小嘎轩遥 2016-01-04  
兄弟大神,求份代码学习。新手。麻烦617000948@qq.com   敬候,谢谢
52 楼 dafengyang 2015-12-27  
哥们,求版源码,邮箱249742073@qq.com
谢谢分享~~
51 楼 dafengyang 2015-12-27  
哥们,求版源码,邮箱yangxf868@163.com
谢谢分享~~
50 楼 对号入座 2015-12-22  
楼主,能不能发个简单点儿的,只需要能抓取新闻并查看新闻内容及图片就行了。不需要语音,谢谢。651175667@qq.com
49 楼 huanchu369 2015-12-04  
583910894@qq.com 求源码,谢谢
48 楼 gqdy365 2015-05-20  
u010860871 写道
博主,能加下你的q吗?我有问题想和你探讨

792108314
47 楼 u010860871 2015-05-13  
博主,能加下你的q吗?我有问题想和你探讨
46 楼 gqdy365 2015-05-08  
u010649761 写道
楼主发我一份完整代码吧,这几天一直在研究这块,快急死了.谢谢了.

工程源码在:https://github.com/gqdy365/onlineNews,如果如法下载,留下邮箱,我发给你;
45 楼 u010649761 2015-05-06  
楼主发我一份完整代码吧,这几天一直在研究这块,快急死了.谢谢了.
44 楼 gqdy365 2015-04-10  
hywgtg 写道
楼主求发一份源码学习下!429546038@qq.com

工程源码在:https://github.com/gqdy365/onlineNews
43 楼 gqdy365 2015-04-10  
hywgtg 写道
楼主求发一份源码学习下!429546038@qq.com

工程源码在:https://github.com/gqdy365/onlineNews
42 楼 gqdy365 2015-04-10  
hywgtg 写道
楼主求发一份源码学习下!429546038@qq.com

工程源码在:https://github.com/gqdy365/onlineNews
41 楼 hywgtg 2015-04-08  
楼主求发一份源码学习下!429546038@qq.com
40 楼 jscxy0407 2015-03-18  
博主好强大,源码可否发我一份,谢谢啊 1196380827@qq.com
39 楼 zzcaaa 2015-03-16  
求一个完整客户端,急求啊 邮箱8wy3409664@163.com
38 楼 hao43284 2015-03-13  
博主好强大,源码可否发我一份,谢谢啊 811706477@qq.com
37 楼 tianqin2011 2015-03-11  
楼主  求源码啊   654534929@qq.com
有邮箱或者QQ的话  也想交流交流
36 楼 胡普行 2015-02-10  
楼主,麻烦抽空给我发一份源码,本人最近项目需要这个功能。麻烦了!邮箱760692689@qq.com   麻烦了
35 楼 tianyaleixiaowu 2015-01-19  
博主,在你万忙的时候,抽出一会时间,送我一份新闻app的源码好吗?我的邮箱:272551766@qq.com, 万分感谢

相关推荐

    android 版新闻客户端

    这款客户端将网络上的新闻内容抓取并解析成适合手机屏幕阅读的格式,允许用户在手机上随时随地获取最新的新闻资讯。 在Android开发中,构建这样的新闻客户端通常涉及以下几个关键知识点: 1. **网络请求与数据获取...

    android若水新闻客户端资料及其源代码

    【Android 若水新闻客户端资料及其源代码】 在Android平台上,开发一个新闻客户端是常见的实践,旨在为用户提供方便快捷的新闻浏览体验。"若水新闻客户端"是一个这样的项目,它的源代码和相关资料提供了深入理解...

    一个android 新闻客户端的参考源代码.rar

    这个名为"一个android 新闻客户端的参考源代码.rar"的压缩包包含了一个Android新闻客户端的源代码,这对于Android开发者来说是一个宝贵的参考资料。源代码的解析是基于HTML的,这意味着它可能利用了网络上的HTML内容...

    基于Android的新闻客户端设计实现分析范本.doc

    ### 基于Android的新闻客户端设计实现分析 #### 1. 绪论 ##### 1.1 研究背景 随着信息技术的飞速发展,人们的生活方式和社会结构正经历着前所未有的变革。在这个信息化的时代,获取及时、准确的信息变得尤为重要...

    android手机新闻客户端和服务器端源码

    新闻数据的生成可能依赖于RSS订阅、API接口调用(如News API, OpenWeatherMap等)或者爬虫技术来抓取和解析网页内容。这些数据经过处理后,以JSON格式返回给客户端。 总结来说,"android手机新闻客户端和服务器端...

    android 高仿新闻客户端

    【Android 高仿新闻客户端】是一款专为Android平台设计的应用程序,它提供了类似热门新闻应用的功能,让用户可以在手机上方便快捷地浏览最新的新闻资讯。这款源码是开发者们学习和研究Android开发,尤其是新闻类应用...

    CSDN客户端 Android新闻客户端 完整代码

    这个项目可能包含了一个能够从CSDN网站抓取数据,展示新闻文章,并提供用户交互的Android应用。 在Android客户端开发中,首先需要了解的基本概念是Android SDK,它是开发Android应用的基础工具集。开发者通常会使用...

    Android客户端抓取网络数据

    在Android客户端开发中,抓取网络数据是常见的需求,它使得应用能够获取远程服务器上的信息,更新内容,发送用户数据等。本篇文章将详细讲解如何在Android应用中使用HTTP协议来实现这一功能,并结合标签"HTTP"以及...

    路透新闻客户端

    在路透新闻客户端中,jsoup可能被用来从路透社的官方网站抓取新闻内容和结构化数据,例如标题、摘要和图片等,从而实现在移动设备上的离线阅读和个性化定制。 xlistview是一个增强版的ListView组件,它针对Android...

    网页抓取教程.zip

    在Java EE和Android开发中,网页抓取是一个重要技能,可以帮助开发者获取网站上的结构化数据,如新闻、产品信息、评论等,以便进行数据分析、监控竞争对手或构建自定义搜索引擎。 本教程“网页抓取教程.zip”可能...

    新闻客户端app源码

    通过学习和分析这个新闻客户端app源码,开发者可以提升其在Android应用开发中的技能,包括网络通信、数据管理、UI设计等多个方面。对于想要深入Android开发或者希望创建自己新闻应用的人来说,这是一个宝贵的资源。...

    Android移动客户端新闻采集器的设计与实现 (1).pdf

    新闻采集器的设计理念是使得用户能够方便快捷地获取和编辑新闻信息,支持网页新闻的动态采集功能,并且能够通过鼠标抓取和拖拽操作来实现新闻编辑。此外,允许用户自定义新闻页面的配置,进一步提高新闻编辑的灵活性...

    Android 手机新闻客户端源码.zip

    源码中会包含不同类型的Activity和Fragment,用于实现新闻列表、详情页等不同功能。 7. **图片加载库**: - Glide或Picasso:这两个库广泛用于Android应用中,用于高效加载和缓存网络图片,防止内存泄漏。 8. **...

    本科毕业设计《基于Android的新闻推荐客户端设计与实现》新闻Python爬虫相关代码.zip

    五、Android客户端实现推荐功能 在Android客户端上实现推荐功能,需要将后端的推荐算法结果通过API接口传递到前端。这涉及到网络请求处理(如使用Retrofit或Volley库)、数据绑定(如使用MVVM架构和LiveData)以及...

    QuickNews新闻客户端源码

    【新闻客户端】是一种移动应用程序,通常用于Android或iOS平台,为用户提供实时的新闻资讯阅读体验。这类应用的主要功能包括新闻分类、搜索、订阅、推送通知等。本项目"QuickNews新闻客户端源码"是一个开放的源代码...

    swift-DayDayNews仿网易新闻客户端实现新闻浏览视频播放

    DayDayNews 仿网易新闻客户端,实现新闻浏览,视频播放,仿搜狐视频、百思不得姐等当前主流视频播放器,实现流媒体播放,自动监听屏幕转动,实现横屏播放 , 抓取百度图片,瀑布流显示,夜间模式,环信即时通讯

    Android应用源码正方教务通用安卓客户端项目

    正方教务系统通用安卓客户端项目源码,本项目是某大学基于正方教务系统开发的安卓客户端项目,实现了课程表查询,个人成绩查询,个人信息查看等功能,国内的很多大学教务系统就是用的这套系统,因为客户端是基于正方...

    一个cnbeta的Android客户端源代码 (包含jsoup的jar包)

    本文将深入探讨一个基于Android平台的cnbeta客户端源代码,该客户端实现了自动化新闻阅读、阅读记录保存以及图片显示的可配置功能,并且整合了jsoup库进行网页解析。 首先,让我们了解核心概念——Android客户端...

    一个cnbeta android客户端源码

    在CNBeta客户端中,它可能被用来抓取和解析网页内容,将其转换为适合展示在Android应用中的结构化数据。这涉及到了网络爬虫技术,以及如何利用Jsoup进行DOM操作和数据提取。 在源码中,我们可以学习到如何构建用户...

    Android应用源码网易新闻风格的猪猪RSS新闻抓取

    本项目的新闻用的是Jsoup抓取自新浪RSS新闻源,天气信息用SAX解析器解析的一个网络XML天气源(2.3.3系统测试不可用,没有使用更高版本测试),新闻主页面可以实现类似于广告图片轮播的效果,新闻列表也可以上下滑动,...

Global site tag (gtag.js) - Google Analytics