文档章节

Play Framework - 数据采集

烟火飘零
 烟火飘零
发布于 2015/09/25 11:25
字数 981
阅读 2903
收藏 59



准备工作:

    环境:

       A.mysql5.6


            mysql设置编码:

               0.若是您确定你的mysql是UTF-8编码的,可以直接进入底4步验证。

               1.下载https://github.com/pgq10240817/PlayNews/blob/master/conf/db/my.ini

               2.把1下载的文件放到您安装目录下面,可以直接命为my.ini(默认是没有改文件的,默认是有my-default.ini).

               3. 然后重启mysq打开cmd,输入services.msc 进入服务管理,定位到MySql,右键重新启动。

               4.打开cmd,进入到%MYSQL%/bin(如果设置了mysql环境变量,可以略过),输入mysql,

                再次输入 

show variables like 'char%';



                界面如下那就代表您成功了。

mysql> show variables like 'char%';
+--------------------------+-------------
-+
| Variable_name            | Value
 |
+--------------------------+-------------
-+
| character_set_client     | utf8
 |
| character_set_connection | utf8
 |
| character_set_database   | utf8
 |
| character_set_filesystem | binary
 |
| character_set_results    | utf8
 |
| character_set_server     | utf8
 |
| character_set_system     | utf8



            B.PLAY 控制台编码。

                    打开windows环境变量设置,添加系统变量:

            

PLAY_OPTS:-Dfile.encoding=GBK




                    楼主尝试过改为UTF8、UTF-8,然而还是乱码。。。。。



       C.创建数据库:

            运行:https://github.com/pgq10240817/PlayNews/blob/master/conf/db/database.sql

            创建数据库,主要是做了下默认编码。

    

        D.play配置:

            1.数据库配置:

                参考https://github.com/pgq10240817/PlayNews/blob/master/client/myNews/conf/db.conf

# Database configuration
# db.default.url="jdbc:mysql://127.0.0.1:3306/dbnews1?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"
db.default.driver=com.mysql.jdbc.Driver  
db.default.url="jdbc:mysql://127.0.0.1/dbnews1"
db.default.user=root
db.default.pass="123456"


# Ebean configuration
#ebean.default="com.yhpl.model.*"
#evolutionplugin=disabled
ebean.default="models.*"



            以上代码可以下载play project/conf/application.conf下面,也可以新建一个db.conf,然后application.conf加入

            include "db.conf"就可以了。

            


            2.常量配置:

                参考:https://github.com/pgq10240817/PlayNews/blob/master/client/myNews/conf/http.conf

                配置了网易音乐的一些常用链接,然后https://github.com/pgq10240817/PlayNews/blob/master/client/myNews/app/com/yhpl/utils/NewsUrlUtil.java

                NewsUtil提供了对该类的写访问。

            3.play路由配置:

                https://github.com/pgq10240817/PlayNews/blob/master/client/myNews/conf/routes

            暂时只是配置了如下:

            

GET /initChannels					controllers.CaptureController.initChannels()
GET /initNews						controllers.CaptureController.initNews()

            其中initChannels代表初始化频道,initNews代表读取频道的value去初始化新闻。



       





数据分析:

    数据来源:

        本次数据来源是采用网易新闻的来源。总共会采集2个分类,1:新闻频道,2:频道下的新闻。

   数据格式:

        通过fiddler抓包,发现网易新闻的数据包格式如下:

                1:频道    

                        https://github.com/pgq10240817/PlayNews/blob/master/conf/data/fiddler/channels.txt

                2:新闻

                        https://github.com/pgq10240817/PlayNews/blob/master/conf/data/fiddler/news.txt

        其中2中的抓包需要用到1的频道ID


    数据分析:

          通过分析数据格式发现,获取频道的内容的URL是固定的,获取新闻需要用到3个参数,频道ID,page,pageCount。



    


编写Bean:

        Bean类位于:

        https://github.com/pgq10240817/PlayNews/tree/master/client/myNews/app/models

        下Channels.java,News.java。




数据采集:

        代码位于:https://github.com/pgq10240817/PlayNews/blob/master/client/myNews/app/controllers/CaptureController.java

        1.频道采集:

    

public static Result initChannels() {
		NewChannalsVo chanals = (NewChannalsVo) JsonFileUtil.getGetUrlContentAsObject(NewsUrlUtil.getChannelUrl(),
				NewChannalsVo.class);
		if (chanals != null) {
			NewChannalVo[] channelArray = chanals.gettList();
			List<Channels> beans = new ArrayList<Channels>();
			for (int i = 0; i < channelArray.length; i++) {
				NewChannalVo jsonObj = channelArray[i];
				Channels bean = new Channels();
				bean.cname = jsonObj.getTname();
				bean.cid = jsonObj.getTid();
				bean.subnum = jsonObj.getSubnum();
				beans.add(bean);

			}
			Ebean.beginTransaction();
			for (int i = 0; i < channelArray.length; i++) {
				Channels bean = beans.get(i);
				Channels target = Channels.getChannelWithCname(bean.cname);
				if (target == null) {
					Ebean.save(bean);
				} else {
					System.out.println("exist -- " + target.cname);
				}
			}

			Ebean.commitTransaction();

		}
		return ok("init Channels success");
	}



        2.新闻采集:


            

public static Result initNews() {
		Page<Channels> pageChannel = Channels.page(1, 20, "id", "asc");
		if (pageChannel.getTotalRowCount() > 0) {
			List<Channels> channelBeans = pageChannel.getList();
			if (!CollectionUtil.isEmpty(channelBeans)) {
				for (int i = 0; i < channelBeans.size(); i++) {

					// A.解析数据
					Channels channelBean = channelBeans.get(i);
					String url = NewsUrlUtil.getChannelNewsUrlWithCidPageCount(channelBean.cid);
					JsonNode node = JsonFileUtil.getGetUrlContentAsJsonNode(url);
					ArrayNode arrayNodes = (ArrayNode) node.get(channelBean.cid);
					Iterator<JsonNode> iter = arrayNodes.iterator();
					List<News> mNews = new ArrayList<News>();
					while (iter.hasNext()) {
						JsonNode childNode = iter.next();
						NewsVo childNews = Json.fromJson(childNode, NewsVo.class);
						News news = new News();
						news.cid = channelBean.cid;
						news.cp = childNews.getSource();
						news.icon = childNews.getImgsrc();
						news.url = childNews.getUrl();
						news.title = childNews.getTitle();
						news.snapDetail = childNews.getDigest();
						news.time = DateUtil.getDateFromString(childNews.getPtime());
						mNews.add(news);
						System.out.println("child:" + childNews);
					}

					// B.过滤数据库
					CollectionUtil.trimListWithFilter(mNews, new TrimFilter<News>() {

						@Override
						public boolean isFilter(News t) {
							return t != null && News.getNewsWithTitle(t.title) != null;
						}
					});

					// C.POJO -> DB
					if (!CollectionUtil.isEmpty(mNews)) {
						System.out.println("save --- > :" + channelBean.cid);
						Ebean.save(mNews);
					}

				}
			}
		}

		return ok("init News success");
	}




               3.运行play之后,第一次初始化会要求add scripts,点击add即可。


          



Next:

        昨天在wooyun提交的漏洞又是审核不通过,理由是:

            无法联系到厂商并且问题影响不大。。。

        那个道友助我一臂啊。。。

        

        下次估计会在国庆节后更,内容主要是,编写接口共客户端调用,会有2个接口,获取频道,获取频道下的新闻。










© 著作权归作者所有

烟火飘零
粉丝 8
博文 12
码字总数 144336
作品 0
成都
程序员
私信 提问
加载中

评论(5)

发票小哥
发票小哥
很厉害!
烟火飘零
烟火飘零 博主

引用来自“jeffsui”的评论

博主 这句 show variables like 'cahr%'; 应该是show variables like 'char%';
多谢道友提醒哦,已经修改了。
jeffsui
jeffsui
博主 这句 show variables like 'cahr%'; 应该是show variables like 'char%';
前尘皆云烟
看到了,用的版本是2.2.6的Play,1.x版本的小伙伴可以洗洗睡了
前尘皆云烟
博主用的Play 是哪个版本的?1.2.x 下application.conf下include是没有用的
Play 1.x 学习资料汇总

1.Play!Framework学习笔记:初识Play(http://blog.csdn.net/w302974215/article/details/46926007) 2.Play Framework入门引导(http://somefuture.iteye.com/blog/1985667) 3.Play框架1.2.7版......

IT追寻者
2016/07/22
88
0
playframework - redis缓存

接着上一篇的play framework 使用教程 使用教程 build.sbt 添加依赖 添加redis配置 application.conf 使用方法 查看redis数据 最后 后面会慢慢放出play framework的实战系列的文章、由于使用...

大猪大猪
05/13
0
0
playframework - 缓存

接着上一篇的play framework 使用教程 使用教程 build.sbt 添加依赖 添加redis配置 application.conf 使用方法 查看redis数据 最后 后面会慢慢放出play framework的实战系列的文章、由于使用...

大猪大猪
05/16
0
0
被Google Play下架刷爆朋友圈:聊聊SDK采集数据的秘密

这两天,朋友圈里都在转载有 APP 被 Google Play 下架一事,也许因为本人朋友圈内从事移动互联网数据行业以及各企业开发者较多,此事被炒得沸沸扬扬。其实可以看出大家一直在讨论的仍是移动互...

玄学酱
2018/05/24
0
0
Play!2.1 通过JPA连接多个数据库

Play framework连接多数据库很简单。 但是这个很简单耗费了我整整两天的时间来找到这个答案。 还好苍天,我还是找到了。 ============================================================= Pl...

davelet
2013/12/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MongoDB系列-解决面试中可能遇到的MongoDB复制集(replica set)问题

关注我,可以获取最新知识、经典面试题以及微服务技术分享   MongoDB复制集(replica set):MongoDB复制集维护相同数据集的一组mongod进程,复制集是生产部署的基础,具有数据冗余以及高可用...

ccww_
32分钟前
4
0
SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache

前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache、RedisCache、ConcurrentMapCache等。 这一节我们来看看Spring Cache使用RedisCache。...

杨小格子
40分钟前
3
0
OpenJDK之CountDownLatch

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CountDownLatch是Doug Lea在JDK1.5中引入的,作用就不详细描述了, await()方法,如果还有线程在执行,那么当前线程...

克虏伯
47分钟前
4
0
简单编程

1.编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include<stdio.h>int main(){char name[3];char family[3];printf("Please input your name and family:\n...

电子工程197沈志初
51分钟前
4
0
详解Mysql分布式事务XA(跨数据库事务)

在开发中,为了降低单点压力,通常会根据业务情况进行分表分库,将表分布在不同的库中(库可能分布在不同的机器上)。在这种场景下,事务的提交会变得相对复杂,因为多个节点(库)的存在,可...

slagga
56分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部