新型肺炎疫情数据Web爬虫+数据持久化+邮件通知
数据源 :丁香园
项目参考:https://gitee.com/TicsmycL/nCoV_Crawler2019
- 共四部分数据: 实时新闻 + 全局信息(全国 确诊x例 疑似x例 死亡x例 治愈x例)+ 各省份疫情 + 辟谣
- 数据库用MYSQL,建表语句在SQL目录下
功能:
- jsoup获取数据,正则匹配筛选数据
- 用mybatis+mysql做数据持久化
- 数据发生变化时,发邮件通知
本项目涉及到的技术:
- Logger日志追踪
- MVC设计模式
- Mybatis3.0原生态SqlSession,工厂设计模式、事务级提交
- 基于Jsoup的Web爬虫数据抓取以及规范
- 基于
java.util.regex.Matcher
、java.util.regex.Pattern
的正则匹配目的数据 - 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
One comment
牛逼