这个作业属于哪个课程 | 2020春W班 |
---|---|
这个作业要求在哪里 | 作业正文 |
结对学号 | 221701101、221701108 |
这个作业的目标 | 设计一个web应用实现上次原型设计作业中的功能 |
作业正文 | .... |
其他参考文献 | ... |
一、GitHub仓库和代码规范
GitHub
CodeStyle
二、成品展示
三、结对讨论描述
四、设计实现
这次的作业,我们选择JSP框架进行开发,用tomcat接受网络请求,使用sqlite进行数据存储,后端通过爬虫进行数据爬取,并存储在数据库中。整体的结构如下。而对于图表等可视化实现,我们使用echarts进行可视化。
1、首先我们先实现了前端的静态页面,将整个网页的结构确定下来。
2、之后插入echarts代码,进行一些修改,以达到期望要求。
3、插入脚本语言,进行数据插入。
4、编写爬虫。
五、代码说明
前端
本次的作业我们以上次原型设计为基础,进行构建。主要分为两个页面首页和各省详情页。
详情页结构如下。
某次疫情统计应用
//整体容器
某次疫情可视化统计
//数据容器
确诊患者:
较昨日
疑似患者:
较昨日
治愈:
较昨日
死亡:
较昨日
//地图可视化容器
//折线图一
//折线图二
//内联窗口
详情页相对比较简单。
<%=province %>省的疫情详情
//折线图1
//折线图2
//返回主页按钮
后端
爬取各个省份现有感染患者人数。这部分就是用到人家已经统计好的数据,先获取一整个网页的内容,再匹配正则表达式,最后转成json格式,通过键值对可以找到想要的数据。
public static List getProvincesData() {
List provinces = new ArrayList();
Province province = null;
String url = "https://ncov.dxy.cn/ncovh5/view/pneumonia";
HttpPojo httpPojo = new HttpPojo();
httpPojo.setHttpHost("ncov.dxy.cn");
httpPojo.setHttpAccept("*/*");
httpPojo.setHttpConnection("keep-alive");
httpPojo.setHttpUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
httpPojo.setHttpReferer("https://ncov.dxy.cn");
httpPojo.setHttpOrigin("https://ncov.dxy.cn");
Map paramObj = new HashMap();
String htmlResult = httpSendGet(url, paramObj, httpPojo);
String getDateReg = "window.getStatisticsService = (.*?)\\}(?=catch)";
Pattern DatePattern = Pattern.compile(getDateReg);
Matcher DateMatcher = DatePattern.matcher(htmlResult);
String result = "";
String modifyTime = "";
String[] names ={"河北", "山西", "辽宁", "吉林", "黑龙江", "江苏", "浙江", "安徽", "福建","江西","山东"
, "河南", "湖北", "湖南","广东","海南","四川","贵州","云南" ,"陕西", "甘肃","青海","台湾","内蒙古"
, "广西","西藏", "宁夏","新疆","北京","天津","上海", "重庆","香港","澳门"};
if (DateMatcher.find()){
result = DateMatcher.group(1);
JSONObject jsonObject = JSONObject.fromObject(result);
modifyTime = jsonObject.getString("modifyTime");
}
String reg = "window.getAreaStat = (.*?)\\}(?=catch)";
Pattern totalPattern = Pattern.compile(reg);
Matcher totalMatcher = totalPattern.matcher(htmlResult);
if (totalMatcher.find()) {
result = totalMatcher.group(1);
JSONArray array = JSONArray.fromObject(result);
for (int i=0;i
爬取3-7至3-14的数据。这部分,有点暴力...就是先找网址,然后访问卫健委每天发布的新闻,用正则表达式匹配(麻烦低效,但我没有好办法)...
provinceDAO.createTable("latest");
for (Province province:Spider.getProvincesData()
) {
//公鸡地图数据
provinceDAO.insert(province,"latest");
}
provinceDAO.createTable("country");
//全国各种趋势图数据
provinceDAO.insert(Spider.getGovCountryData("http://www.xinhuanet.com/politics/2020-03/08/c_1125679196.htm"),"country");//3.07的数据
provinceDAO.insert(Spider.getGovCountryData("http://www.xinhuanet.com/politics/2020-03/09/c_1125682837.htm"),"country");//3.08的数据
provinceDAO.insert(Spider.getGovCountryData("http://www.xinhuanet.com/politics/2020-03/10/c_1125688175.htm"),"country");//3.09的数据
provinceDAO.insert(Spider.getGovCountryData("http://www.xinhuanet.com/politics/2020-03/11/c_1125694000.htm"),"country");//3.10的数据
provinceDAO.insert(Spider.getGovCountryData("http://www.xinhuanet.com/politics/2020-03/12/c_1125699532.htm"),"country");//3.11的数据
provinceDAO.insert(Spider.getGovCountryData("http://www.xinhuanet.com/politics/2020-03/13/c_1125706520.htm"),"country");//3.12的数据
provinceDAO.insert(Spider.getGovCountryData("http://www.xinhuanet.com/politics/2020-03/14/c_1125711265.htm"),"country");//3.13的数据
//详细省份数据
provinceDAO.createTable("黑龙江");
provinceDAO.insert(Spider.getHeilongjiangData("http://wsjkw.hlj.gov.cn/index.php/Home/Zwgk/show/newsid/8142/navid/42/stypeid/"),"黑龙江");//3-7
provinceDAO.insert(Spider.getHeilongjiangData("http://wsjkw.hlj.gov.cn/index.php/Home/Zwgk/show/newsid/8144/navid/42/stypeid/"),"黑龙江");//3-8
provinceDAO.insert(Spider.getHeilongjiangData("http://wsjkw.hlj.gov.cn/index.php/Home/Zwgk/show/newsid/8145/navid/42/stypeid/"),"黑龙江");//3-9
provinceDAO.insert(Spider.getHeilongjiangData("http://wsjkw.hlj.gov.cn/index.php/Home/Zwgk/show/newsid/8146/navid/42/stypeid/"),"黑龙江");//3-10
provinceDAO.insert(Spider.getHeilongjiangData("http://wsjkw.hlj.gov.cn/index.php/Home/Zwgk/show/newsid/8147/navid/42/stypeid/"),"黑龙江");//3-11
provinceDAO.insert(Spider.getHeilongjiangData("http://wsjkw.hlj.gov.cn/index.php/Home/Zwgk/show/newsid/8148/navid/42/stypeid/"),"黑龙江");//3-12
provinceDAO.insert(Spider.getHeilongjiangData("http://wsjkw.hlj.gov.cn/index.php/Home/Zwgk/show/newsid/8149/navid/42/stypeid/"),"黑龙江");//3-13
六、心路历程
221701101: 首先我得反省下自己,因为我在数据爬取上花的时间太多,导致后面用来前后端合并的时间不多。一开始直接在丁香医生地图上爬取,后面发现没有每一天的数据,于是我又转变了方向...到每个省卫健委网爬取他们每天发布的新闻...(但是他们写文章的格式都不一样啊!!),但我还是这么做了,每个省爬两天的数据(吐血),一般的网页可以爬取,但是有的网页有反爬功能,直接返回512错误等等(可能我还没实现真正意义上的爬取吧)。然鹅,即使是这样,我还是没有非常好的爬到数据。(鉴于时间紧迫,数据部分不是很完整)。但是示例(黑龙江)有七天的数据可以展示。早知道,还是直接用上次作业的数据了(后悔.jpg)。因为我们这学期刚好有javaee课,前几周上课学了点jsp,于是一开始我们打算采用这个技术。直到真的编写代码的时候,我真的很崩溃(当事人表示非常后悔),一在jsp里import自己写的数据库工具类就出错,没找到原因。后面队友提点,让我把原生代码写进去。写是写了,在class.forName这句编译通不过,昨天弄了一整个晚上,眼看作业做不出来,我伤心得不行。。终于在今早,发现是因为没有添加sqlite-jdbc JAR。数据库基础实在是太差了==!虽然,这个过程真的很不容易(我太菜),也还是慢慢摸爬滚打,站起来了,终于交作业了好开心。然后感谢下我的队友,因为我前面浪费了很多时间,当我这边出现问题时,他(默默无闻)也很努力地在找解决办法。唯一的不足可能就是我们的沟通还需要再加强一点。合作愉快,后会有期!
221701108: 这次的作业从拿到要求开始,我觉得这次的作业应该不会太难。但是从学习使用框架、构建页面等等一步步做下来,也将将在deadline前赶出成果来。事实上,流程还算得上是流畅的,主要花时间的是在处理错误上。比如在连接数据库上,一开始出错,找度娘,jstl、standard.jar包缺失,补上,仍出错,继续找度娘,数据库connector版本太旧,更新,仍出错。找来找去,最后是少了jdbc.jar。并且在网上关于这样的错误信息非常的少。总而言之,还是我自己对于JSP框架了解的太少了,学习不透彻,还需要更加努力啊(到底还是菜)。
在这次的作业中我和我的队友共同探讨,共同进步,最后的错误也是在队友的提醒下解决的(相反地我给队友指了反方向)。总的来说,一个字,强;两个字很强。