新型肺炎疫情数据Web爬虫+数据持久化+邮件通知

数据源 :丁香园
项目参考:https://gitee.com/TicsmycL/nCoV_Crawler2019

  • 共四部分数据: 实时新闻 + 全局信息(全国 确诊x例 疑似x例 死亡x例 治愈x例)+ 各省份疫情 + 辟谣
  • 数据库用MYSQL,建表语句在SQL目录下
  • 功能:

    • jsoup获取数据,正则匹配筛选数据
    • 用mybatis+mysql做数据持久化
    • 数据发生变化时,发邮件通知

本项目涉及到的技术:

  1. Logger日志追踪
  2. MVC设计模式
  3. Mybatis3.0原生态SqlSession,工厂设计模式、事务级提交
  4. 基于Jsoup的Web爬虫数据抓取以及规范
  5. 基于java.util.regex.Matcherjava.util.regex.Pattern的正则匹配目的数据
  6. JSON解析器的构造

主要内容

public class InformationService {
    private final Logger logger = Logger.getLogger(InformationService.class);

    private InformationDao informationDao;

    public InformationService() {
        this.informationDao = new InformationDao();
    }

    public void getNews(){
        //获取HTML数据
        Tools.getPageByJSoup(Crawler.URL);

        //提取static信息的json数据
        String staticInformation = null;
        //解析static信息的json数据
        Statistics statisticsInformation = null;
        //解析rymorList信息的json数据
        RymorList rymorList = null;

        try{
            staticInformation=Tools.getInformation(Crawler.STATIC_INFORMATION_REGEX_TEMPLATE_1,"id",Crawler.STATIC_INFORMATION_ATTRIBUTE);
            statisticsInformation= Parse.parseStatisticsInformation(staticInformation);
        }catch(NullPointerException e ){
            logger.error("static信息正则1匹配失败,切换正则2");
            staticInformation=Tools.getInformation(Crawler.STATIC_INFORMATION_REGEX_TEMPLATE_2,"id",Crawler.STATIC_INFORMATION_ATTRIBUTE);
            statisticsInformation= Parse.parseStatisticsInformation(staticInformation);
        }

        //数据持久化
        String timeLineNews =null;
        String provinceNews=null;
        String rymorNews=null;

        String statisticsNews = informationDao.insertStatistics(statisticsInformation);
        if (statisticsNews != null){
            //总数据发生变化,各省数据更新
            //提取其他信息的json数据

            String timelineServiceInformation= Tools.getInformation(Crawler.TIME_LINE_REGEX_TEMPLATE,"id",Crawler.TIME_LINE_ATTRIBUTE);
            String areaInformation=Tools.getInformation(Crawler.AREA_INFORMATION_REGEX_TEMPLATE,"id",Crawler.AREA_INFORMATION_ATTRIBUTE);
            String rymorListInformation = Tools.getInformation(Crawler.RYMOR_INFORMATION_REGEX_TEMPLATE,"id",Crawler.RYMOR_INFORMATION_ATTRIBUTE);

            //解析
            List<TimeLine> timeLineList = Parse.parseTimeLineInformation(timelineServiceInformation);
            List<AreaStat> areaStatList = Parse.parseAreaInformation(areaInformation);
            System.out.println("---"+rymorListInformation);
            List<RymorList> rymorLists = Parse.parseRymorInformation(rymorListInformation);

            timeLineNews = informationDao.insertTimeLine(timeLineList);
            provinceNews = informationDao.insertProvince(areaStatList);
            rymorNews = informationDao.inserRymorList(rymorLists);

//            sendEmail(timeLineNews,provinceNews,statisticsNews);
        }

        informationDao.destory();
    }
}

数据转换流程解析:

[Jsoup.connect(url).get()]Dpcument(page)-->
[m.group()]String(result)-->
[JSON.parseArray(string)]JSONArray(jsonArray)-->
[JSON.toJavaObject((JSON) jsonObj,Pojo.class)]JavaBean(pojo)

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据:Jsoup详解参考地址


项目下载

项目地址:nCoV_Crawler2019
附:本项目仅供学习,持续更新请关注参考项目



注:Navicat可将表导出成exel

Last modification:March 14th, 2020 at 03:47 pm
喵ฅฅ