项目_基于网络爬虫的疫情数据可视化分析

这是一个使用SpringBoot、MyBatis和ECharts构建的大数据课程设计项目,实现了从丁香园网站爬取并实时更新新冠肺炎疫情数据,通过Jsoup解析JSON数据,存储到数据库并进行可视化展示。项目每天定时爬取两次数据,确保数据时效性和精确性,前端使用Vue.js和ECharts进行数据图表展示。

基于网络爬虫的疫情数据可视化分析


0、前言

这个是去年9月份,大三上学期《大数据技术应该开发》的课程设计,这个作品我很早就想做了,但是因为课业加上项目,所以一直耽搁,所以就当成大数据课程作业做了。虽然做了一个月,只是因为个人技术菜,其实做了一小部分的功能,我也拿着这个作品去参加了很多的比赛,目前拿到了校内比赛“大数据应用大赛”的一等奖,还有另外一个比赛的三等奖。

其他有想法的小伙伴可以加上一些其他的功能,完善之后可以去参加计算机设计大赛,单拿这个去参赛还是比较单薄的,加上自己的想法完善一下也是一个不错的选择。

加上自己的想法,换上一个好看的模板(之前上传一些模板),继续优化优化,让内容更加丰富,就可以去参加很多比赛了。

资料包括:

  1. 后端源码(含数据库脚本)
  2. 前端源码
  3. 报告(50页左右,大概10000字)

源码下载:基于网络爬虫的新冠肺炎疫情数据可视化分析。

资源下载:可视化大屏模板。


1、背景

唉……大学才四年,疫情占三年。


2、技术栈

2.1、后端

Spring Boot、MyBatis、Druid、HttpClient、Jsoup、Fastjson、MySQL、Maven。

2.2、前端

ECharts、Vue.js、Axios、JavaScript、CSS、HTML。


3、设计思路

3.1、本地开发阶段

基于爬虫技术在 https://ncov.dxy.cn/ncovh5/view/pneumonia 爬取的疫情数据,之后使用 Jsoup 解析器对数据进行解析处理得到原始的 JSON 数据,再将 JSON 数据转化为Java 实体类并进行持久化处理,基于ECharts对数据进行可视化展示。

3.2、上线部署阶段

为达到对疫情数据实时监控的效果,采用实时爬取数据的方式,开启 Spring Boot 的定时任务并将项目部署至阿里云服务器,于每日早上八点和晚上十点各爬取一次数据,并对数据进行处理和持久化操作,全天不间断地向前端输出接口,以保证数据的时效性、精确性。


4、实现效果

4.1、后端效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


4.2、前端效果

在这里插入图片描述
在这里插入图片描述


5、实现步骤

数据持久化使用MyBatis很简单,数据展示使用ECharts也没什么难度。

稍有难度就是数据的爬取和处理了,所以在此处简单地将一下。


5.1、导入依赖

后端项目目录。

在这里插入图片描述

首先,创建一个Spring Boot工程项目,导入HttpClient和Jsoup的依赖。

在这里插入图片描述


5.2、HttpClient爬取数据

TimeUtils.java工具类源码:

/**
 * Author Mr.Zhang
 * Date 2020/5/27 11:23
 * Desc 时间工具类
 */
public abstract class TimeUtils {
   
   
    public static String format(Long timestamp, String pattern) {
   
   
        return FastDateFormat.getInstance(pattern).format(timestamp);
    }
}

HttpUtils.java工具类源码:

/**
 * Author Mr.Zhang
 * Date 2021/9/10 16:05
 * Desc 封装HttpClient工具,方便爬取网页内容
 */
@Component
public class HttpUtils {
   
   
    //声明httpClient管理器对象(HttpClient连接池)
    private static PoolingHttpClientConnectionManager cm = null;
    private static RequestConfig config = null;
    private static List<String> userAgentList = null;

    //静态代码块会在类被加载的时候执行
    static {
   
   
        cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(200);
        cm.setDefaultMaxPerRoute(20);
        config = RequestConfig.custom()
                .setSocketTimeout(10000)
                .setConnectTimeout(10000)
                .setConnectionRequestTimeout(10000)
                .build();
        userAgentList = new ArrayList<String>();
        userAgentList.add("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36");
        userAgentList.add("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:73.0) Gecko/20100101 Firefox/73.0");
        userAgentList.add("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15");
        userAgentList.add("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299");
        userAgentList.add("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36");
        userAgentList.add("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0");

    }

    /**
     * 获取页面的HTML的源码字符串
     *
     * @param url 页面的URL地址
     * @return HTML的源码字符串
     */
    public String getHtml(String url) {
   
   
        //1.从连接池中获取HttpClient对象
        CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
        //2.创建HttpGet对象
        HttpGet httpGet = new HttpGet(url);
        //3.设置请求配置对象和请求头
        httpGet.setConfig(config);
        httpGet.setHeader("User-Agent", userAgentList.get(new Random().nextInt(userAgentList.size())));
        //4.发起请求
        CloseableHttpResponse response = null;
        try {
   
   
            response = httpClient.execute(httpGet);
            //5.获取响应内容
            if (response.getStatusLine().getStatusCode() == 200) {
   
   
                String html = "";
                if (response.getEntity() != null) {
   
   
                    html = EntityUtils.toString(response.getEntity(), "UTF-8");
                }
                return html;
            }
        } catch (IOException e) {
   
   
            e.printStackTrace();
        } finally {
   
   
            if (response != null) {
   
   
                try {
   
   
                    response.close()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值