• 【毕业设计】 python flas疫情爬虫可视化



    🧿 选题指导, 项目分享:

    https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md

    1 课题背景

    自2019年12月12日武汉确诊新型冠状病毒患者开始,历时三年之久的新冠疫情仍未结束。新型冠状病毒肺炎(COVID-19)存在人畜跨界传播、传染性强、影响因素多样、传播途径复杂等特点,导致肺炎疫情发病急、发展快、溯源分析难、社会危害大等问题。随着新型冠状病毒毒株的不断变异,现出现了传播性极强、免疫逃逸能力极高的变异病毒。
    为更直观、更专业地了解疫情的变化,本文设计了基于爬虫、Dianjo、Pyecharts的COVID-19疫情信息可视化系统。该系统主要包括疫情模型预测、疫情信息可视化以及防疫措施指南三大功能,能够实时动态展示疫情发展趋势,并根据预测模型进行疫情预测以及提供有效的防疫措施。

    2 实现效果

    首页
    在这里插入图片描述
    动画展示
    在这里插入图片描述
    省份统计
    在这里插入图片描述

    省排名
    在这里插入图片描述

    3 Flask框架

    简介

    Flask是一个基于Werkzeug和Jinja2的轻量级Web应用程序框架。与其他同类型框架相比,Flask的灵活性、轻便性和安全性更高,而且容易上手,它可以与MVC模式很好地结合进行开发。Flask也有强大的定制性,开发者可以依据实际需要增加相应的功能,在实现丰富的功能和扩展的同时能够保证核心功能的简单。Flask丰富的插件库能够让用户实现网站定制的个性化,从而开发出功能强大的网站。

    本项目在Flask开发后端时,前端请求会遇到跨域的问题,解决该问题有修改数据类型为jsonp,采用GET方法,或者在Flask端加上响应头等方式,在此使用安装Flask-CORS库的方式解决跨域问题。此外需要安装请求库axios。

    Flask框架图

    相关代码:

    from flask import Flask, render_template
    import csv
    import codecs
    
    web = Flask(__name__)
    
    # 首页
    @web.route('/')
    def index():
        return render_template('index.html')
    
    # 疫情可视化动画展示模块
    @web.route('/movie')
    def movie_list():
        movies = [{'file':'top10省现有确诊病例对比.mp4','title':'Top10省现有确诊病例对比'},
                  {'file':'Top15国现有确诊病例对比.mp4','title':'Top15国现有确诊病例对比'}]
        return render_template('movie.html',movies=movies)
    
    # 中国新冠疫情实时数据地图模块
    @web.route('/map')
    def map():
        return render_template('map.html')
    
    # 今日发生疫情省份统计模块
    @web.route('/pie')
    def pie():
        with codecs.open(filename='../data/china_data.csv', mode='r', encoding='utf-8') as f:
            reader = csv.reader(f)
            head = next(reader)
    
            today_confirm1 = {}
            today_confirm2 = []
            for item in reader:
                args = tuple(item)
                today_confirm1.update({args[2]: args[3]})
    
            for key, value in today_confirm1.items():
                if (value != '0'):
                    # today_confirm2.append({key: value})
                    today_confirm2.append({'name': key, 'value': value})
    
            print(today_confirm2)
    
        return render_template('pie.html',today_confirm=today_confirm2)
    
    # 各省累计确诊排名模块
    @web.route('/rank')
    def	rank():
        with codecs.open('../data/china_data.csv', mode='r', encoding='utf-8') as f:
            reader = csv.reader(f)
            head = next(reader)
    
            province_name = []
            province_confirm = []
            for item in reader:
                args = tuple(item)
                # print(args)
                province_name.append(args[2])
                province_confirm.append(args[9])
            print(province_name)
            print(province_confirm)
    
        return render_template('rank.html', province_name=province_name,province_confirm=province_confirm)
    
    web.run(debug=True)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    4 Echarts

    ECharts(Enterprise Charts)是百度开源的数据可视化工具,底层依赖轻量级Canvas库ZRender。兼容了几乎全部常用浏览器的特点,使它可广泛用于PC客户端和手机客户端。ECharts能辅助开发者整合用户数据,创新性的完成个性化设置可视化图表。支持折线图(区域图)、柱状图(条状图)、散点图(气泡图)、K线图、饼图(环形图)等,通过导入 js 库在 Java Web 项目上运行。

    5 爬虫

    简介

    Scrapy是基于Twisted的爬虫框架,它可以从各种数据源中抓取数据。其架构清晰,模块之间的耦合度低,扩展性极强,爬取效率高,可以灵活完成各种需求。能够方便地用来处理绝大多数反爬网站,是目前Python中应用最广泛的爬虫框架。Scrapy框架主要由五大组件组成,它们分别是调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)、Scrapy引擎(Scrapy Engine)。各个组件的作用如下:

    1. 调度器(Scheduler):说白了把它假设成为一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是 什么,同时去除重复的网址(不做无用功)。用户可以自己的需求定制调度器。

    2. 下载器(Downloader):是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy的下载器代码不会太复杂,但效率高,主要的原因是Scrapy下载器是建立在twisted这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。

    3. 爬虫(Spider):是用户最关心的部份。用户定制自己的爬虫(通过定制正则表达式等语法),用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。 用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。

    4. 实体管道(Item Pipeline):用于处理爬虫(spider)提取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。

    5. Scrapy引擎(Scrapy Engine):Scrapy引擎是整个框架的核心.它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。

    官网架构图

    相关代码:

    # -*- coding: utf-8 -*-
    
    import scrapy
    import random
    import time
    from foodwake.items import FoodwakespiderItem
    
    
    class FoodwakeSpider(scrapy.Spider):
        name = 'foodwake'
        allowed_domains = ['www.foodwake.com']
        start_urls = ['http://www.foodwake.com/category/food-class/0']
    
        # //:匹配任意位置的节点 @:匹配属性
        def parse(self, response): 
            for box in response.xpath('//div[@class="row margin-b2"]//a'):
                new_url = box.xpath('.//@href').extract()[0]
                yield scrapy.http.Request(new_url, callback=self.parse_item)
    
        def parse_item(self, response):
            for box in response.xpath('//div[@class="row margin-b2"]//a'):
                new_url = box.xpath('.//@href').extract()[0]
                yield scrapy.http.Request(new_url, meta={"url": new_url}, callback=self.parse_item_info)
    
        def parse_item_info(self, response):
            item = FoodwakespiderItem()
            name = response.xpath('//h1[@class="color-yellow"]/text()').extract()[0].strip()
            # food_nickname = ""
            # try:
            #     nicknames = response.xpath('//h2[@class="h3 text-light"]/text()').extract()[0].strip()
            #     food_nickname = nicknames.split(':')[1]
            # except:
            #     food_nickname = "无"
            # url = response.meta["url"]
            infoList = []
            for box in response.xpath('//table[@class="table table-hover"]//tr'):
                tds = box.xpath('.//td')
                if len(tds) == 3:
                    info = {}
                    td_name = tds.xpath('.//text()').extract()[0]
                    td_unit = tds.xpath('.//text()').extract()[1]
                    td_value = ""
                    try:
                        td_value = td_unit + tds.xpath('.//text()').extract()[2]
                        info[td_name] = td_value
                    except:
                        info[td_name] = td_unit
                    infoList.append(info)
            item['name'] = name
            item['info'] = str(infoList)
            # item['url'] = url
            # item['nickname'] = food_nickname
            yield item
            print("······休眠 1 至 5 秒······")
            time.sleep(random.randint(1, 5))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    6 最后

  • 相关阅读:
    单细胞组学简介
    HTML学生个人网站作业设计:个人主页博客web网页设计制作 (HTML+CSS) (1)
    黑苹果安装心得
    DolphinScheduler 3.0安装及使用
    多态(polymorphic)
    《Vue.js实战》8.2实战
    Java注解相关
    Centos - DISK(RAID5和LVM)配置
    git从入门到跑路
    【学习笔记】Maven
  • 原文地址:https://blog.csdn.net/HUXINY/article/details/126484768