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

基于Python+Pyecharts+爬虫实现的对全球疫情新增患者可视化分析 本文利用了Python+Pyecharts+网络爬虫疫情新增进行分析,由于本人才疏学浅,难免有些疏漏,希望各位大神多加点评 阅读详情

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


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();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //httpClient.close();//注意:这里的HttpClient是从cm(连接池)中获取的,不需要关闭
        }
        return null;
    }
}

分析:封装HttpClient工具类,对HttpClient连接池进行配置,对外提供一个静态方法getHtml(String url),方便爬取网页的内容。

传入https://ncov.dxy.cn/ncovh5/view/pneumonia,作为getHtml的参数。

在这里插入图片描述


5.3、Jsoup解析数据

Covid19DataCrawler.java的源码:

/**
 * 实现疫情数据爬取
 */
@Component
public class Covid19DataCrawler {
    private static final Logger logger = LoggerFactory.getLogger(Covid19DataCrawler.class);
    @Autowired
    private HttpUtils httpUtils;
    @Autowired
    private ProvinceCovidService provinceCovidService;
    @Autowired
    private CityCovidService cityCovidService;
    @Autowired
    private StatisticsDataService statisticsDataService;

    //后续需要将该方法改为定时任务,如每天8点定时爬取疫情数据
    //@Scheduled(initialDelay = 1000, fixedDelay = 1000 * 60 * 60 * 24)
//    @Scheduled(cron = "0 8 8,0 * * ?")
    @Scheduled(cron = "0 22 20,0 * * ?")   //每天早的八点半,晚十点半,各更新执行一次
    public void crawling() {
        //获取当前时间
        String dateTime = TimeUtils.format(System.currentTimeMillis(), "yyyy-MM-dd");
        logger.info("当前系统的时间为:{}", dateTime);
        //1.爬取指定页面
        String html = httpUtils.getHtml("https://ncov.dxy.cn/ncovh5/view/pneumonia");

        //2.解析页面中指定内容
        //获取 id = getAreaStat 的全国疫情数据
        Document document = Jsoup.parse(html);
        String text = document.select("script[id=getAreaStat]").toString();

        //3.使用正则表达式获取json格式的疫情数据
        //定义正则规则
        String regex = "\\[(.*)\\]";
        //编译成正则对象
        Pattern pattern = Pattern.compile(regex);
        //去text中进行匹配
        Matcher matcher = pattern.matcher(text);
        String jsonStr = "";
        if (matcher.find()) {
            jsonStr = matcher.group(0);
            //由各省份组成的JSON字符串,包含省份和下属城市
            logger.info("已经爬取到截止至{}数据", dateTime);
        } else {
            logger.info("no match");
        }

        //对JSON数据进行进一步解析
        //4.将第一层json(省份数据)解析为JavaBean
        List<CovidData> provincesCovidDataList = JSON.parseArray(jsonStr, CovidData.class);  //由各个省份CovidData组成的List集合

        logger.info("已经爬取到 {} 个省份的数据", provincesCovidDataList.size());       //全国34个省(包括港澳台)
        Integer provinceCount = 0;      //省份的计数变量
        for (CovidData provinceCovidData : provincesCovidDataList) {     //provinceCovidData为省份的数据
            provinceCovidData.setDatetime(dateTime);        //设置省份实体的时间
            provinceCount++;
            //5.获取每个省份的每一天的新冠数据的统计数据
            //System.out.println("count-- +" + count + "每天统计数据的URL:" + provinceCovidData.getStatisticsData());      //一共有34条URL,对应34个省份
            String provinceStatisticsDataJsonStr = httpUtils.getHtml(provinceCovidData.getStatisticsData());
            //5.1、provinceStatisticsDataJsonStr有两个字段,我们获取其中的“data”字段,“data”字段的值是某省每一天的统计数据(JSON数据格式)
            String statisticsDataStr = JSON.parseObject(provinceStatisticsDataJsonStr).getString("data");
            //5.2、把解析出来的每一天的统计数据设置回省份provinceCovidData的statisticsData中,因为之前存放的只是一个URL路径
//            provinceCovidData.setStatisticsData(statisticsDataStr);       //这个字段太长了,所以新建一个表单独分开

            /*
                CovidData的省份部分数据已经爬取完毕,实例化新冠数据省份实体类ProvinceCovid
             */
            ProvinceCovid provinceCovid = new ProvinceCovid();
            provinceCovid.setProvinceName(provinceCovidData.getProvinceName());
            provinceCovid.setProvinceShortName(provinceCovidData.getProvinceShortName());
            provinceCovid.setCurrentConfirmedCount(provinceCovidData.getCurrentConfirmedCount());
            provinceCovid.setConfirmedCount(provinceCovidData.getConfirmedCount());
            provinceCovid.setSuspectedCount(provinceCovidData.getSuspectedCount());
            provinceCovid.setCuredCount(provinceCovidData.getCuredCount());
            provinceCovid.setDeadCount(provinceCovidData.getDeadCount());
            provinceCovid.setLocationId(provinceCovidData.getLocationId());
            provinceCovid.setHighDangerCount(provinceCovidData.getHighDangerCount());
            provinceCovid.setMidDangerCount(provinceCovidData.getMidDangerCount());
            provinceCovid.setDatetime(provinceCovidData.getDatetime());
            provinceCovidService.addProvinceCovid(provinceCovid);           //将省份数据存入数据库中
            logger.info("已持久化第 {} 个省份的数据:{} ", provinceCount, provinceCovid.getProvinceName());
            logger.info("{} 当前确诊人数:{}", provinceCovid.getProvinceName(), provinceCovid.getCurrentConfirmedCount());
            logger.info("{} 累计确诊人数:{}", provinceCovid.getProvinceName(), provinceCovid.getConfirmedCount());
            logger.info("{} 疑似病例人数:{}", provinceCovid.getProvinceName(), provinceCovid.getSuspectedCount());
            logger.info("{} 治愈人数:{}", provinceCovid.getProvinceName(), provinceCovid.getCuredCount());
            logger.info("{} 死亡人数:{}", provinceCovid.getProvinceName(), provinceCovid.getDeadCount());
            logger.info("统计时间:{}", provinceCovid.getDatetime());

            //5.3、把provinceStatisticsDataJsonStr解析成StatisticsData实体对象集合
            List<StatisticsData> statisticsDataList = JSON.parseArray(statisticsDataStr, StatisticsData.class);
            for (StatisticsData statisticsData : statisticsDataList) {
                //psId=null, provinceId=null, provinceName='null',dateId='20210703',其中,psId不用管,
                String provinceName = provinceCovidData.getProvinceName();
                statisticsData.setProvinceName(provinceName);//设置provinceName
                /*
                    将StatisticsData实体对象存入到数据库中
                 */
                statisticsDataService.addStatisticsData(statisticsData);
            }
            logger.info("统计数量:{}", statisticsDataList.size());
            logger.info("已持久化 {} 的统计数据", provinceCovidData.getProvinceName());

            //6、获取每个省份的下属城市的数据
            String citiesCovidDataJsonStr = provinceCovidData.getCities();      //每个省份包含城市组成的JSON字符串
            //System.out.println(provinceCovidData.getProvinceName() + "的下属城市:");   //可以正常打印出34个省份的各个城市
            //6.1、解析省份下属的城市
            List<CityCovid> citiesCovidDataList = JSON.parseArray(citiesCovidDataJsonStr, CityCovid.class);     //由当前省份下属城市CityCovid组成的List集合
            for (CityCovid cityCovid : citiesCovidDataList) {
                cityCovid.setDatetime(dateTime);        //给城市实体设置时间
                cityCovid.setProvinceId(provinceCovidService.getProvinceIdByProvinceName(provinceCovidData.getProvinceName()));   //设置城市所属的省份id
                /*
                    将当前省份的下属城市数据存入数据库中
                 */
                cityCovidService.addCityCovid(cityCovid);
                logger.info("已持久化 {} 的 {} 的数据", provinceCovidData.getProvinceName(), cityCovid.getCityName());
            }
        }
    }
}

分析:使用Jsoup的id选择器,获取"script[id=getAreaStat]"疫情数据,再使用正则表达式"\\[(.*)\\]"对疫情数据进行匹配,获取到由每个省份的新冠肺炎疫情数据组成的JSON数组。

 //1.爬取指定页面
String html = HttpUtils.getHtml("https://ncov.dxy.cn/ncovh5/view/pneumonia");
//2.解析页面中指定内容
//获取 id = getAreaStat 的全国疫情数据
Document document = Jsoup.parse(html);
String text = document.select("script[id=getAreaStat]").toString();
//3.使用正则表达式获取json格式的疫情数据
String regex = "\\[(.*)\\]";  //定义正则规则
Pattern pattern = Pattern.compile(regex);   //编译成正则对象
Matcher matcher = pattern.matcher(text);    //去text中进行匹配

在这里插入图片描述

使用JSON校验工具对JSON数据进行格式化。
在这里插入图片描述

在这里插入图片描述

其中“statisticsData”字段的值是一个URL地址,需要再解析一次,如图所示。解析后得到JSON字符串,我们再拿到该字符串的data字段即可。

在这里插入图片描述

使用JSON校验工具对JSON数据进行格式化。

在这里插入图片描述


5.4、创建Java实体类

根据爬取得到的新冠肺炎疫情数据的JSON字符串的字段,创建省份、城市和统计数据三个实体类,将JSON数据的字段与实体类的属性一一对应,再使用Fastjson工具进行转换。

/**
 * 省份实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProvinceCovid implements Serializable {
    private Integer provinceId;              //省份id
    private String provinceName;             //省份名称
    private String provinceShortName;        //省份短名
    private Integer currentConfirmedCount;   //当前确诊人数
    private Integer confirmedCount;          //累记确诊人数
    private Integer suspectedCount;          //疑似病例人数
    private Integer curedCount;              //治愈人数
    private Integer deadCount;               //死亡人数
    private Integer locationId;              //当前省份的位置id
    private Integer highDangerCount;         //高风险地区
    private Integer midDangerCount;          //低风险地区
private String datetime;                 //时间
}
/**
 * 城市实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CityCovid implements Serializable {
    private Integer cityId;                     //城市id
    private Integer provinceId;                 //所属省份id
    private String cityName;                    //城市名
    private Integer locationId;                 //城市的位置id
    private Integer currentConfirmedCount;      //当前确诊人数
    private Integer confirmedCount;             //累记确诊人数
    private Integer suspectedCount;             //疑似病例人数
    private Integer curedCount;                 //治愈人数
    private Integer deadCount;                  //死亡人数
    private Integer highDangerCount;            //高风险地区
    private Integer midDangerCount;             //中风险地区
private String datetime;                    //时间
}
/*
    统计数据实体类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StatisticsData implements Serializable {
    private Integer psId;                    //统计数据id
    private String provinceName;             //所属省份名
    private Integer confirmedCount;          //累计确诊人数
    private Integer confirmedIncr;           //新增累计确诊人数
    private Integer curedCount;              //治愈人数
    private Integer curedIncr;               //新增治愈人数
    private Integer currentConfirmedCount;   //当前确诊人数
    private Integer currentConfirmedIncr;    //新增当前确诊人数
    private Integer deadCount;               //死亡人数
    private Integer deadIncr;                //死亡人数新增
    private Integer highDangerCount;         //高风险地区
    private Integer midDangerCount;          //中风险地区
    private Integer suspectedCount;          //疑似病例
    private Integer suspectedCountIncr;      //新增疑似病例
private String dateId;                   //时间格式:yyyyMMdd,如20200119
}

5.5、JSON与实体类映射

Fastjson工具包提供了一个抽象类JSON,该类提供了两个方法,parseArray(String jsonStr)和parseObject(),根据需要调用即可。

//将JSON字符串转化为Class类实例化对象的List集合。
public static <T> java.util.List<T> parseArray(@Nullable String text, Class<T> clazz);

//将JSON字符串转化为Class类的实例化对象。
public static <T> T parseObject(@Nullable String text,Class<T> clazz);

5.6、数据持久化和可视化

至5.5,数据已经封装到Java的实体类中了,接下来就是常规的MyBatis持久化存储,然后通过Controller提供接口给前端进行数据可视化展示。

也就是常规的Controller、Service、Dao层代码的编写,这部分就不说了,不是重点,也没难度。

接下来以StatisticsDataController.java为例简单演示。

@Controller
@RequestMapping("/statisticsData")
public class StatisticsDataController {
    private final static Logger logger = LoggerFactory.getLogger(CityCovidController.class);

    @Autowired
    private ProvinceCovidService provinceCovidService;

    @GetMapping("/getCountrySumDeadCount")
    @ResponseBody
    public String getCountrySumDeadCount() {
        Integer sumDeadCount = provinceCovidService.getSumDeadCount();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("sumDeadCount", sumDeadCount);
        jsonObject.put("comment", "全国累计死亡人数");
        logger.info("/statisticsData/getCountrySumDeadCount");
        logger.info("已获取到全国累计死亡人数:{}", sumDeadCount);
        return jsonObject.toJSONString();
    }

    @GetMapping("/getCountrySumCuredCount")
    @ResponseBody
    public String getCountrySumCuredCount() {
        Integer sumCuredCount = provinceCovidService.getSumCuredCount();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("sumCuredCount", sumCuredCount);
        jsonObject.put("comment", "全国累计治愈人数");
        logger.info("/statisticsData/getCountrySumCuredCount");
        logger.info("已获取到全国累计治愈人数:{}", sumCuredCount);
        return jsonObject.toJSONString();
    }

    @GetMapping("/getCountrySumCurrentConfirmedCount")
    @ResponseBody
    public String getCountrySumCurrentConfirmedCount() {
        Integer sumCurrentConfirmedCount = provinceCovidService.getSumCurrentConfirmedCount();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("sumCurrentConfirmedCount", sumCurrentConfirmedCount);
        jsonObject.put("comment", "全国现存确诊人数");
        logger.info("/statisticsData/getCountrySumCurrentConfirmedCount");
        logger.info("已获取到全国现存确诊人数(当前确诊人数):{}", sumCurrentConfirmedCount);
        return jsonObject.toJSONString();
    }

    @GetMapping("/getCountrySumConfirmedCount")
    @ResponseBody
    public String getCountrySumConfirmedCount() {
        Integer sumConfirmedCount = provinceCovidService.getSumConfirmedCount();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("sumConfirmedCount", sumConfirmedCount);
        jsonObject.put("comment", "全国累计确诊人数");
        logger.info("/statisticsData/getCountrySumConfirmedCount");
        logger.info("已获取到全国累计确诊人数:{}", sumConfirmedCount);
        return jsonObject.toJSONString();
    }

    @GetMapping("/getCountrySumHighDangerCount")
    @ResponseBody
    public String getCountrySumHighDangerCount() {
        Integer sumHighDangerCount = provinceCovidService.getSumHighDangerCount();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("sumHighDangerCount", sumHighDangerCount);
        jsonObject.put("comment", "全国现存高风险地区的数量");
        logger.info("/statisticsData/getCountrySumHighDangerCount");
        logger.info("已获取到全国现存高风险地区的数量:{}", sumHighDangerCount);
        return jsonObject.toJSONString();
    }

    @GetMapping("/getCountrySumMidDangerCount")
    @ResponseBody
    public String getCountrySumMidDangerCount() {
        Integer sumMidDangerCount = provinceCovidService.getSumMidDangerCount();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("sumMidDangerCount", sumMidDangerCount);
        jsonObject.put("comment", "全国现存中风险地区的数量");
        logger.info("/statisticsData/getCountrySumMidDangerCount");
        logger.info("以获取到全国现存中风险地区的数量:{}", sumMidDangerCount);
        return jsonObject.toJSONString();
    }

    @GetMapping("/getCountrySumSuspectedCount")
    @ResponseBody
    public String getCountrySumSuspectedCount() {
        Integer sumSuspectedCount = provinceCovidService.getSumSuspectedCount();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("sumSuspectedCount", sumSuspectedCount);
        jsonObject.put("comment", "全国现存疑似病例");
        logger.info("/statisticsData/getCountrySumSuspectedCount");
        logger.info("全国现存疑似病例:{}", sumSuspectedCount);
        return jsonObject.toJSONString();
    }
}

至此,这个小项目算是完成了……

基于Python爬虫的中国疫情数据可视化分析实战项目(初学者练习) 随着新冠疫情在全球持续蔓延,及时获取并分析疫情数据对公共卫生决策和公众知情权至关重要。Python凭借其强大的生态系统,成为实现疫情数据采集与可视化的首选语言。本章介绍基于requestsSelenium等工具的爬虫技术链,以及利用PandasMatplotlibSeaborn进行数据清洗与多维可视化的整体流程。结合Jupyter Notebook的交互式开发环境,本项目构建了一套可复现、易调试的数据分析流水线,涵盖从网页抓取到动态图表生成的全链路实践路径。 阅读详情

相关推荐

《疫情之下,数据之上》源码解析与实战指南

在现代网页构建中,HTML、CSS 和 JavaScript 是构成用户界面的三大基石。HTML(HyperText Markup Language)作为网页的骨架,负责页面的结构和内容,CSS(Cascading Style Sheets)则负责样式和布局,JavaScript 作为编程语言,赋予网页交互能力。掌握这三项技能,对于任何希望在前端领域有所建树的开发者来说,都是不可或缺的基础。掌握 HTML、CSS 和 JavaScript 是成为前端开发者的基础。

weixin_42418754的博客 977

数据分析毕业设计 flask疫情数据分析可视化系统 - python 爬虫

网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。爬虫对某一站点访问,如果可以访问就下载其中的网页内容,并且通过爬虫解析模块解析得到的网页链接,把这些链接作为之后的抓取目标,并且在整个过程中完全不依赖用户,自动运行。若不能访问则根据爬虫预先设定的策略进行下一个 URL的访问。在整个过程中爬虫会自动进行异步处理数据请求,返回网页的抓取数据。在整个的爬虫运行之前,用户都可以自定义的添加代理,伪 装 请求头以便更好地获取网页数据。

kooerr的博客 845

Java疫情数据分析可视化系统实战项目

Java 自诞生以来,凭借其“一次编写,到处运行”的特性,成为企业级后端开发的首选语言。本章将从 Java 的语言特性入手,如跨平台性、自动内存管理、丰富的类库支持等,解析其在构建高性能、高可用性系统中的核心优势。在疫情数据分析系统中,Java 被广泛用于构建后端服务,处理数据采集、业务逻辑运算、持久化存储等关键流程。通过 Spring 系列框架的支持,开发者可以快速构建模块化、可扩展的系统架构,为疫情数据的实时分析与可视化展示提供稳定支撑。

weixin_35756892的博客 1240

Python爬虫、数据清洗与可视化-4-1 -post

pwZw =30x30) 居中的图片: 居中并且带尺寸的图片: 当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。 如何插入一段漂亮的代码片 去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片. // An highlighted block var foo = 'bar'; 生成一个适合你的列表 项目 项目 项目 项目1 项目2 项目3 计划任务 完成任务 创建一个表格 一个简单的表格是这么创建的: 项目 Value 电脑 $1

m0_56267896的博客 328

基于python爬虫的中国疫情数据可视化分析

包含了所有的源代码,本项目是一个练手的爬虫小案例。

【2025年五一数学建模竞赛】A题 完整论文 模型建立与求解

2025年五一数学建模竞赛 A题:基于历史数据与模式识别的道路车流量推测模型研究

Magnolia_He的博客 3783

爬虫--可视化项目(二)

创建flask项目,导入模板,创建路由。

qq_65676857的博客 668

Sigrity XtractIM实战:5步搞定IC封装宽带模型提取(附BGA案例)

本文通过一个典型BGA封装案例,详细介绍了使用Cadence Sigrity XtractIM工具进行IC封装宽带模型提取的五步实战流程。内容涵盖从环境准备、参数设置、结果验证到模型导出的完整操作,重点阐述了如何利用XtractIM生成高精度、紧凑的宽带SPICE模型,以解决高速电路设计中因封装模型不准导致的信号与电源完整性问题,助力工程师提升仿真精度与设计效率。

a1b2c的博客 320

毕业设计 基于python的疫情爬虫分析可视化系统

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是🚩基于python的疫情爬虫分析可视化系统🥇学长这里给一个题目综合评分(每项满分5分)难度系数:3分工作量:3分创新点:3分🧿。

HUXINY的博客 7514

k8s中如何使用gpu、gpu资源讲解、nvidia gpu驱动安装

gpu资源也是服务器中常见的一种资源,gpu即显卡,一般用在人工智能、图文识别、大模型等领域,其中nvidia gpu是nvidia公司生产的nvidia类型的显卡,amd gpu则是adm公司生产的amd类型gpu。企业中服务器最常见的就是英伟达gpu服务器了。本篇也主要讲解英伟达驱动相关的知识。

MssGuo的博客 1万+

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

一朵花开的时间 6155

使用python对疫情数据进行可视化分析

阅读目录 1.获取并处理疫情数据 1.1数据获取 本文所用到的数据来源于腾讯疫情实时追踪。 获取数据之前应事先分析数据所在的url,进入腾讯疫情实时追踪网站以后,打开抓包工具可以看到图下两个url,实际上全国疫情数据是以json的形式保存在这两个url中,要获取疫情数据数据可以直接访问以下两个url将它们保存以json的文件格式到本地,或者通过python的request请求得到,也可以使用同样的方式获取全球的疫情数据,本文只对全国疫情数据进行了可视化展示。 当日详情数据:详情数据 历史数据:历史数据 1.

weixin_45874832的博客 7678

【PointNet++】使用Open3D对分割后的结果可视化

PointNet++中的局部分割网络预测后是没有可视化文件的,所以需要自己通过编写Open3D或者PCL点云算法去可视化,在本人经过查找翻阅修改后,实现了网络输出点云分割后结果的可视化。已实现推测单个点云,并可视化。

纵马踏花向自由 2453

大数据毕设项目 大数据实时疫情数据可视化系统 - flask python

# 1 前言🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是🚩 基于大数据的实时疫情数据可视化项目🥇学长这里给一个题目综合评分(每项满分5分)这两年大家最关心的便是疫情的进展情况了,每天睡前看一眼,睡醒盯一眼,恨不得实时关注着,而很多官方平台也用可视化的方式,实时更新着数据。通过图形图像的方式展示着

caxiou的博客 619

Codex 100个真实案例 - 全系列总结与Codex最佳实践全解析

历经100个案例的淬炼,我们终于来到了终点!本篇是整个系列的压轴之作——全面回顾100个案例的分类统计、提炼Codex使用的核心技巧和最佳实践、总结Prompt工程的精华要点、剖析常见错误及解决方案、展望AI编程的未来趋势,并为不同水平的读者规划学习路径。这不仅是一篇总结,更是一本Codex实战手册!

yueyeguzhuo的专栏 136

数据分析案例-电脑笔记本价格数据可视化分析3

本文基于Kaggle笔记本数据集(1303条记录,13个变量),使用Python进行数据可视化分析。通过自定义函数预处理了CPU频率、内存类型等关键特征,利用Seaborn和Matplotlib绘制了品牌分布、内存类型占比、价格影响因素等可视化图表。研究发现:1)Dell和Lenovo市场份额最大;2)SSD是主流存储类型;3)高RAM配置普遍采用SSD;4)Intel处理器占据绝对优势。分析揭示了不同品牌、配置与价格的关系,为消费者购买决策和市场策略制定提供了数据支持。

m0_64336780的博客 1万+

基于Flask框架的疫情信息分析平台

基于Flask框架的疫情信息分析平台,适合初学者的练手项目,用简单易懂的代码实现了所有功能。

AEKSAN的博客 1125

117、HDR多帧融合算法:曝光序列、运动鬼影消除与合成权重的高效实现

HDR多帧融合算法实战经验总结 本文分享了HDR多帧融合算法在实际应用中的关键技术和优化经验。主要内容包括: 曝光序列设计:强调动态调整曝光时间比、帧间间隔和拍摄顺序的重要性,特别指出短-中-长的拍摄顺序优势。 运动鬼影消除:比较了三种运动检测方法,推荐梯度域检测方案,并强调在RAW域进行检测的必要性。 合成权重设计:提出基于高斯型权重函数的多因素考量方法,包括基础权重、运动权重和噪声权重的综合处理策略。 高效实现方案:提供NEON指令集加速的具体代码示例,包括梯度计算、权重查表和融合处理等关键步骤。 实用

zzfmlxs的博客 65

大数据毕设 大数据实时疫情数据可视化项目 - flask python

1 前言🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是🚩🥇学长这里给一个题目综合评分(每项满分5分)🧿。

fawubio的博客 210

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(一)爬虫篇

一切来不的猝不及防 一个半月前,武汉还是那个纵横江湖、肆意人间的武汉。165条江河日夜奔流,100多种不重样的过早热气蒸腾,两江四岸13千米长的沿江灯光秀将889个楼宇依次点亮,灯影重重、觥筹交错。武汉从来不缺人间烟火,而今天,毫无疑问,武汉人——以及更多的人正在陪伴武汉度过它的关键时刻 ! 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析 使用itchat给亲人朋友发生分析报...

分享既学习 8304

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

在线实习项目|Python爬虫助力疫情数据追踪在线实习项目

2019-NCOV新型冠状病毒引发的肺炎牵动全国人民的心,本项目希望通过大数据技术为抗击新冠肺炎贡献一份力量。

tipdm0526的博客 599

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

基于flask疫情数据可视化与趋势预测分析-flask

基于flask实现的疫情数据可视化与趋势预测分析flask进行开发

wanglindda的博客 420

爬虫+数据可视化毕业设计:疫情数据爬取及可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩】

爬虫+数据可视化毕业设计:疫情数据爬取及可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩】https://b23.tv/TYz2N3z

laoman456的博客 772

数据科学与大数据技术毕业设计项目选题大全

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是🚩基于python/大数据的疫情分析与可视化系统🥇学长这里给一个题目综合评分(每项满分5分)难度系数:4分工作量:4分创新点:3分🧿选题指导, 项目分享:见文末。

caxiou的博客 838

信息安全毕业论文(毕设)任务书大全

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是🚩基于python/大数据的疫情分析与可视化系统🥇学长这里给一个题目综合评分(每项满分5分)难度系数:4分工作量:4分创新点:3分🧿选题指导, 项目分享:见文末。

caxiou的博客 1279
上一篇: 项目_基于网络爬虫的疫情数据可视化分析
下一篇: 中间件_Redis_05_Redis的持久化
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

窝在角落里学习

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

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

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

打赏作者

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

抵扣说明:

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

余额充值