Play Framework - 数据采集

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

准备工作:

环境:

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

文章转载自 开源中国社区[https://www.oschina.net]

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10月前
|
算法 计算机视觉 iOS开发
iOS 实时图像处理技术:Core Image 框架的应用
【4月更文挑战第8天】 在移动设备上实现高效的图像处理功能,对于提升用户体验和扩展应用程序能力至关重要。苹果公司的iOS平台提供了强大的Core Image框架,它允许开发者以高效和直观的方式执行复杂的图像处理任务。本文将深入探讨Core Image框架的关键特性,并通过实例演示如何在iOS应用中集成实时图像处理功能,不仅提高性能,同时保持了电池寿命的优化。我们将重点讨论面部识别、滤镜应用和性能优化等关键技术点,为读者提供一份全面的iOS图像处理指南。
|
10月前
|
存储 数据建模 iOS开发
iOS设备功能和框架: 什么是 Core Data,它在 iOS 中的作用是什么?
iOS设备功能和框架: 什么是 Core Data,它在 iOS 中的作用是什么?
168 1
|
7月前
|
数据处理 开发者 监控
揭秘实时Web应用开发:WebSocket与Akka Streams如何让Play Framework如虎添翼?
【8月更文挑战第31天】实时Web应用需求日益增长,覆盖了从即时通讯到在线游戏等多个领域。Play Framework结合WebSocket与Akka Streams,简化了高效实时应用的开发。WebSocket提供全双工通信,使服务器能主动向客户端推送消息;Akka Streams支持声明式数据流处理,有效避免系统因数据处理不及时而崩溃。本文通过示例代码展示了如何利用这些技术构建实时股票报价系统,展现了其在实时数据处理方面的强大能力。掌握这一技术组合,将大幅提升你在实时Web应用开发中的效率与稳定性。
86 0
|
JavaScript Java 开发工具
Cocos Creator Android 平台接入 Google Firebase (Analytics功能)(二)
Cocos Creator Android 平台接入 Google Firebase (Analytics功能)
405 0
|
Android开发 开发者
Cocos Creator Android 平台接入 Google Firebase (Analytics功能)(一)
Cocos Creator Android 平台接入 Google Firebase (Analytics功能)
342 1
|
数据采集 算法 数据可视化
Unity实现camera数据注入RMP推送或轻量级RTSP服务模块
Unity实现camera数据注入RMP推送或轻量级RTSP服务模块
150 0
|
数据可视化 API iOS开发
EZAudio:一个 iOS 和 OSX 上的音频可视化框架
EZAudio 是一个 iOS 和 OSX 上简单易用的音频框架。 它的官方的页面在 The Official EZAudio
994 0
EZAudio:一个 iOS 和 OSX 上的音频可视化框架
|
开发工具 iOS开发
iOS中制作可复用的框架Framework(一)
iOS中制作可复用的框架Framework
163 0
iOS中制作可复用的框架Framework(一)
|
存储 缓存 数据可视化
Core Image:iOS图像处理技术追踪
Core Image是苹果官方提供的图像处理框架,通过丰富的built-in(内置)或自定义Filter(过滤器)高效处理静态图片、动态图片或视频。开发者还可以通过构造Filter链或自定义Core Image Kernel来实现更丰富的效果。 在WWDC20中,苹果官方针对Core Image技术在以下三方面做了优化:Core Image对视频/动图的支持、基于Metal构建Core Image (CI) Kernel以及Core Image的Debug支持。 这三方面会在下文逐一提到,文末笔者也会浅谈Core Image在手淘图片库中的应用可能以及对Core Image技术的展望。
1936 0
|
iOS开发
iOS 利用 framework 进行动态更新
前言 目前 iOS 上的动态更新方案主要有以下 4 种: HTML 5 lua(wax)hotpatch react native framework 前面三种都是通过在应用内搭建一个运行环境来实现动态更新(HTML 5 是原生支持),在用户体验、与系统交互上有一定的限制,对开发者的要求
15210 0