Play Framework - 数据采集


准备工作:

环境:

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 ‘cahr%‘;

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

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个接口,获取频道,获取频道下的新闻。

时间: 2024-10-16 18:19:49

Play Framework - 数据采集的相关文章

用WidgeDuino创建一个SCADA(监控与数据采集)系统

WidgeDuino – 最近在Kickstarter上亮相 – 是一个智能的易配置的窗口- 基于Microsoft Windows平台和基于像 Atmel-based Arduino board 的微控制器系统通讯应用. 实质上, WidgeDuino 通过串口协议或者 TCP/IP 与微控制器系统通讯. "这包括, 除其他外, 键盘, LED灯, 压力表, 旋钮, 滑块, 温度计, 容器及按钮. 其直观方法是,通讯简化了快速原型和完整的自动化系统发展." 更准确的说, Widged

看我如何快速学习.Net(高可用数据采集平台)

最近文章:高可用数据采集平台(如何玩转3门语言php+.net+aauto).高并发数据采集的架构应用(Redis的应用) 项目文档:关键词匹配项目深入研究(二)- 分表思想的引入 吐槽:本人也是非常讨厌拿来主义的,有些培训每个细节都提到过,主管还找我要实际案例,而不是去安排合适的人去做这件事情,有点过于拿来主义了,有点担心. 好消息的是:高并发数据采集的架构应用(Redis的应用)团队已经实现了,不过有部分代码还是我写的,值得喝彩下,说明团队的能力还是不错的. 最近有时间,我也是用.net完成

利用 Django REST framework 编写 RESTful API

利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framework 真乃一大神器,可以轻易的甚至自动化的搞定很多事情,比如: 自动生成符合 RESTful 规范的 API 支持 OPTION.HEAD.POST.GET.PATCH.PUT.DELETE 根据 Content-Type 来动态的返回数据类型(如 text.json) 生成 browserable

iOS库--.a与.framework

一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存. 三.iOS里静态库形式? .a和.framework 四.iOS里动态库形式? .dylib和.framework 五.framework为什么既是静态库又是动态库? 系统的.framework是动态库,我们自己建立的.fram

Multithreading Batch Processing Framework

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # Author: f0rsaken 4 5 import argparse 6 import importlib 7 import sys 8 import threadpool 9 import time 10 11 def main(): 12 parser = argparse.ArgumentParser(description="Multithreading Batch Proce

安装mysql时,提示This application requires .NET framework 4.0问题

Question:双击MySQL的安装文件, 弹框提示, Answer:安装微软的 .NET Framework 4或更新的版本,下载地址:https://www.microsoft.com/zh-cn/Search/result.aspx?q=.net+framework&x=0&y=0 安装完成后安装MySQL即可.

数据采集之Web端上传文件到Hadoop HDFS

前言 最近在公司接到一个任务,是关于数据采集方面的. 需求主要有3个: 通过web端上传文件到HDFS; 通过日志采集的方式导入到HDFS; 将数据库DB的表数据导入到HDFS. 正好最近都有在这方面做知识储备.正所谓养兵千日,用兵一时啊.学习到的东西只有应用到真实的环境中才有意义不是么. 环境 这里只做模拟环境,而不是真实的线上环境,所以也很简单,如果要使用的话还需要优化优化. OS Debian 8.7 Hadoop 2.6.5 SpringBoot 1.5.1.RELEASE 说明一下,这

使用自定义的framework

1.创建framework工程,创建需要的类将接口暴露在public中 2.运行后可在window/projects 的Derived Data中找到framwork所在路劲(分别在真机和模拟器下运行,会在product文件中生成不同的文件) 3.使用lipo命令合并库 lipo -create 库1的路径 库2的路劲 -ouput 库名 (图为库) 将生成的库(如果没有设置的话,库生成在根目录上),将其复制到模拟器或者真机的framework中覆盖原有的库. 4.在新工程中导入framewor

Entity Framework的查询

Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式). 1.简单查询: SQL: SELECT * FROM [Clients] WHERE Type=1 AND Deleted=0 ORDER BY ID EF: //Func形式 var clients = ctx.Clients.Where(c => c.Type == 1 && c.D