`

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客户端抓取网络数据

    使用http协议在安卓手机客户端引用网络资源,可以在手机上实现很多只有在网页上才能实现的功能

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

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

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

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

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

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

    有林新闻客户端第一版源码

    这段时间做的一个新闻客户端,界面优美,数据都是从百度新闻那里直接抓取的,有json和html解析。上面的滑动Tab是通过自定义View自己画出来的,列表的图片都是通过异步软引用方式加载的,可以流畅的运行。另外新闻详情...

    Android 仿CSDN资讯客户端

    Android 仿CSDN资讯客户端通过jsoup抓取html资讯信息,使用谷歌官方SwipeRefreshLayout进行刷新展示,RecyclerView资讯新闻列表展示; 用数据库保存最后一次刷新的资讯信息并清空之前的信息,当网络断开或服务器错误...

    Java实现从正方教务系统抓取数据(三)--android客户端

    正方教务系统数据抓取(含验证码识别),模拟登录,抓取课表,考试成绩,考试安排,个人信息。并且提供了Json Api接口可供客户端调用。这个是android端调用的

    工大新闻客户端

    基于Android的新闻客户端,从网站上抓取信息,用手机显示,ListView和WebView显示

    android融云服务端与客户端Demo

    相信开发融云没有服务端很难下手,于是抓取到融云得到Token的地址并返回使得服务端代码不多而且简单,同时还有个人制作的聊天Demo开发聊天功能轻而易举。

    仿糗事百科客户端_android版

    该程序为仿新版的糗事百科客户端,数据是通过jsoup来抓取糗事百科网页版的,程序能正常运行,由于原客户端中有些功能模块的数据不能通过网页中抓取到,所有这类功能模块没有实现。程序sdk为android 4.0以上的版本,...

    Android 仿36Kr.zip

    Android 仿36Kr 是一个仿照36Kr官方App,实时抓取36Kr官网数据的资讯类新闻客户端。 功能包括首页新闻,详情,发现,活动,侧滑效果,第三方登录以及分享,消息推送等。通过爬虫技术实时抓取36Kr数据 使用技术:Android5.0...

    Android应用源码新闻天气商城聊天功能4合一综合项目

    图文分享:使用的ShareSDK,实现了抓取新闻, 城市选择器修改了一下界面。 主界面:主要是分别类,数据库做了几张一对多的表,查询是写死的,但是因为没有数据,暂时只可以进来今日折扣和女装。 列表界面:列表界面...

    Subsonic, DSub Android客户端 fork的主页.zip

    Subsonic, DSub Android客户端 fork的主页 基本指令抓取依赖库git submodule initgit submodule update转到ServerProxy并生成项目文件android update project --path./

    Android仿照36Kr官方新闻项目课程源码.zip

    Android仿照36Kr官方新闻项目课程源码一个仿照36Kr官方,实时抓取36Kr官网数据的资讯类新闻客户端。包括首页新闻,详情,发现,活动,实时数据抓取,侧滑效果,第三方登录以及分享,消息推送等相关功能客户端。

    ACAJ:一个使用 JSON 抓取数据的 Android 客户端应用程序

    ACAJ 使用 JSON 获取数据的 Android 客户端应用程序。 仅用于教育。 将项目导入 Eclipse。 构建级别 JDK 1.7+ Android 级别 API 19 您需要将 Web 应用程序设置为服务器端才能生成 json 字符串作为响应。

    小团队知识管理的Android移动客户端服务程序.zip

    爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL...

    百度新闻贴吧图片

    这段时间做的一个新闻客户端,界面优美,数据都是从百度(百度新闻,百度知道,百度贴吧,百度图片)那里直接抓取的,有json和html解析。列表的图片都是通过异步软引用方式加载的,其中百度图片部分设计很多图片,...

    基于IjkPlayer的仿Bilibili Android客户端,直播及点播视频源来自于网络爬虫.zip

    爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL...

    android抓包工具

    用于在android客户端上抓取数据包,对实时数据进行分析。

Global site tag (gtag.js) - Google Analytics