精华内容
下载资源
问答
  • python爬虫数据可视化
    千次阅读
    2022-05-15 10:58:23

    Python爬虫——数据可视化

    导入需要的第三方库

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    import requests
    import urllib3
    import matplotlib as mpl

    设置可以显示中文和改变字体

    mpl.rcParams['font.sans-serif'] = ['KaiTi']
    mpl.rcParams['font.serif'] = ['KaiTi']
    mpl.rcParams['axes.unicode_minus'] = False
    sns.set_style("darkgrid", {"font.sans-serif": ['KaiTi', 'Arial']})

    爬取数据:此方法只适用于表格

    urllib3.disable_warnings()
    url = "http://www.stats.gov.cn/ztjc/zdtjgz/zgrkpc/dqcrkpc/ggl/202105/t20210519_1817699.html"
    response = requests.get(url, verify=False)
    response.encoding = response.apparent_encoding
    html = response.text
    data = pd.read_html(html, header=0)[1]
    print(data)

    提取数据中的某一列

    city = list(data["地区"])#提取数据中名为“地区”的一列
    year1 = list(data["2020年"])#提取数据中名为“2020年”的一列
    year2 = list(data["2010年"])#提取数据中名为“2010年”的一列

    将数据可视化为折线图

    he = {"2020年": year1, "2010年": year2}#在图中显示数据命名year1命名为“2020年”
                                          #在图中显示数据命名year2命名为“2010年”
    df = pd.DataFrame(he, city)#he代表纵坐标,city代表横坐标
    df.plot.line()#定义绘制折线图
    plt.show()#将折线图展示

    完整代码如下

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    import requests
    import urllib3
    import matplotlib as mpl
    
    #设置可以显示中文和改变字体
    mpl.rcParams['font.sans-serif'] = ['KaiTi']
    mpl.rcParams['font.serif'] = ['KaiTi']
    mpl.rcParams['axes.unicode_minus'] = False
    sns.set_style("darkgrid", {"font.sans-serif": ['KaiTi', 'Arial']})
    
    #爬取数据只适用于表格
    urllib3.disable_warnings()
    url = "http://www.stats.gov.cn/ztjc/zdtjgz/zgrkpc/dqcrkpc/ggl/202105/t20210519_1817699.html"
    response = requests.get(url, verify=False)
    response.encoding = response.apparent_encoding
    html = response.text
    data = pd.read_html(html, header=0)[1]
    print(data)
    
    #提取数据中的某一列
    city = list(data["地区"])
    year1 = list(data["2020年"])
    year2 = list(data["2010年"])
    
    #将数据可视化为折线图
    he = {"2020年": year1, "2010年": year2}
    df = pd.DataFrame(he, city)
    df.plot.line()
    plt.show()
    

     最后展示的折线图

    更多相关内容
  • python爬虫,并将数据进行可视化分析,数据可视化包含饼图、柱状图、漏斗图、词云、另附源代码和报告书。
  • Python爬虫数据可视化分析大作业,python爬取豆瓣电影Top250数据分析与可视化(应用Flask框架、Echarts、WordCloud等技术)。
  • 模拟浏览器这些基本数据都可以爬取:为了实现交互型爬取,我写了一个能够实现输入想了解的职位就能爬取相关内容的函数这里我除了爬取图上信息外,还把职位超链接后的网址,以及公司超链接的网址爬取下来了。...
  • 基于Python爬虫的书籍数据可视化分析.pdf
  • 数据处理与可视化之Altair 后言-python爬虫相关库 网络爬虫简介 网络爬虫(webcrawler,又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种用来自动浏览万维网的程序或者脚本。爬虫...
  • 基于Python爬虫的电影数据可视化分析.pdf
  • python 爬虫数据可视化展示

    千次阅读 2022-02-11 10:17:54
    学了有关python爬虫数据可视化的知识,想着做一些总结,加强自己的学习成果,也能给各位小伙伴一些小小的启发。 1、做任何事情都要明确自己的目的,想要做什么,打算怎么做,做到什么样的程度,自己有一个清晰的...

    python 爬虫及数据可视化展示

    学了有关python爬虫及数据可视化的知识,想着做一些总结,加强自己的学习成果,也能给各位小伙伴一些小小的启发。

    1、做任何事情都要明确自己的目的,想要做什么,打算怎么做,做到什么样的程度,自己有一个清晰的定位,虽然计划永远赶不上变化,但是按计划走,见招拆招或许也是不错的选择。

    2、本项目是爬取豆瓣的250部电影,将电影名,电影链接,评分等信息爬取保存到本地。将相关信息以列表的形式展示在网页上,访问者可通我的网站直接挑转到豆瓣查看电影,将评分制作评分走势图,将电影制作成词云图在网页上展示,共有五个网页,可相互跳转。

    项目流程图:

    在这里插入图片描述

    数据爬取:

    # -*- codeing = utf-8 -*-
    # @Time : 2022/1/11 22:39
    # @Author : lj
    # @File : spider.PY
    # @Software: 4{PRODUCT_NAME}
    import bs4  # 网页解析,获取数据 对网页的数据进行拆分
    import re   #正则表达式,进行文字匹配   对数据进行提炼
    import urllib.request,urllib.error  #指定url 获取网页数据 怕网页
    import xlwt  #进行excel 操作  存再excel中
    import sqlite3 #进行sqllite 数据库操作 存在数据库中
    import time
    # 主函数
    def main():
        # 调用函数
        url = "https://movie.douban.com/top250?start="
        datalist1 = allData(url)
        # savepath = "豆瓣电影top250.xls"
        # savedata(datalist1,savepath)
        dbpath = "move.db"
        savedatasql(datalist1,dbpath)
    #匹配所需内容的正则表达式
    linkpattern = re.compile(r'<a href="(.*?)/">')
    #匹配图片的正则表达式
    imagepattern = re.compile(r'<img .*src=".*"/>',re.S)#re.S 忽略换行符,.表示除了换行符以外的所有字符
    #匹配影名的正则表达式
    namepattern = re.compile(r'<span class="title">(.*)</span>')
    # 影片评分
    gradepattern = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
    # 评价人数
    peoplepattern = re.compile(r'<span>(\d*)人评价</span>')#(\d*) 零个或多个
    #概况
    thinkpattern = re.compile(r'<span class="inq">(.*)</span>')
    #影片的相关内容
    contentpattern = re.compile(r'<p class="">(.*?)</p>',re.S)#忽略换行符
    
    #1、爬取一个网页
    def getData(url1):
        head = {
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0"}
        request = urllib.request.Request(url1,headers=head)
        html = ""
        try:
            response = urllib.request.urlopen(request)
            html = response.read().decode("utf-8")
            # print(html)
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
                print(e.code)
            if hasattr(e,"reason"):
                print(e.reason)
        return html  #返回给调用的地方
    # 2、爬取所有网页,匹配分析
    def allData(url):
        datalist = []
        for i in range(0, 10):  # 左闭右开 调用十次,每次二十五条信息
            url1 = url + str(i * 25)
            html = getData(url1) #保存获取到的网页源码
            time.sleep(1)
            # 逐页解析
            soup = bs4.BeautifulSoup(html,"html.parser") #返回树型结构
            for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,返回列表,class加下划线
                data = []
                item = str(item)
                #link 获取到影片的超链接
                link = re.findall(linkpattern,item)[0]
                data.append(link)
                # 影片图片
                image = re.findall(imagepattern,item)[0]
                data.append(image)
                # 影片名
                name = re.findall(namepattern,item)
                if(len(name)==2):
                    chinaname = name[0]
                    data.append(chinaname)
                    outername = name[1].replace("/","")#.replace("/","") 列表内置的方法,将/替换为空""
                    data.append(outername)
                else:
                    data.append(name[0])
                    data.append('  ')#外文名空出来
                # 影片评分
                grade = re.findall(gradepattern,item)[0]
                data.append(grade)
                # 影片评价人数
                people = re.findall(peoplepattern, item)[0]
                data.append(people)
                # 影片概况
                think = re.findall(thinkpattern, item)
                if len(think) != 0:
                    think = think[0].replace("。","")
                    data.append(think)
                else:
                    data.append("  ")
                # 影片内容
                content = re.findall(contentpattern, item)[0]
                content = re.sub('<br(\s+)?/>(\s+)?'," ",content)#替换内容中多余的符号和内容
                content = re.sub('/'," ",content)
                data.append(content.strip())#去除列表中的空格
                datalist.append(data)
        return datalist
    #3、保存数据到excel
    # def savedata(datalist1,savepath):
    #     workplace = xlwt.Workbook(encoding="utf-8",style_compression=0)#style_compression=0·压缩样式
    #     worksheet = workplace.add_sheet("豆瓣电影top250",cell_overwrite_ok="true")#cell_overwrite_ok=true 是否可以覆盖
    #     col = ('电影详情链接','电影图片链接','影片中文名','影片外文名','评分','评价人数','概况','影片内容')
    #     for i in range(0,8):
    #         worksheet.write(0,i,col[i])
    #     for i in range(0,250):
    #         print("打印了%d条" %(i+1))
    #         databuffer = datalist1[i]
    #         for j in range(0,8):
    #             worksheet.write(i+1,j,databuffer[j])
    #     workplace.save(savepath) #保存
    #3、保存数据到数据库
    def savedatasql(datalist1,dbpath):#dbpath 数据库的路径位置
        init_db(dbpath)
        conn = sqlite3.connect(dbpath)
        cur = conn.cursor()#获取一个游标,存放sql语句的执行结果
        #cur 获得了游标可存放执行结果的对象
        #将datalist1中的数据依次遍历写入数据库
        for data in datalist1:
            for index in range(len(data)):
    
                if index == 4 or index == 5:
                    continue
                # data[index] = "'" + data[index].replace(u'\xa0','') + "'"
                data[index] = data[index].replace("'", "")
                data[index] = "'"+data[index]+"'"
    
            sql = '''
                    insert into move250(
                    move_link,img_link,move_chinaname,move_foriername,grade,numbers,introduction,content)
                    values (%s)'''%",".join(data)
            #print(sql)
            cur.execute(sql)
            conn.commit()
        cur.close()
        conn.close()
        print("write successful")
    
    #创建数据库
    def init_db(dbpath):
    
        sql = '''
            create table move250
            (
            id integer primary key autoincrement,
            move_link text,
            img_link text,
            move_chinaname varchar,
            move_foriername varchar,
            grade numeric,
            numbers numeric,
            introduction text,
            content text
            )
        '''
        c = sqlite3.connect(dbpath)
        buffer = c.cursor()  # 获取游标
        buffer.execute(sql)  # 内置的方法执行sql语句
        c.commit()   #         数据提交,写入数据库
        c.close()   #          数据库关闭
        print("database create successful")
    if __name__ == "__main__":
        #调用函数
        main()
        print("爬取完毕!")
    
    
    

    数据库数据

    在这里插入图片描述

    excel数据

    在这里插入图片描述

    可视化制作

    在这里插入图片描述

    路由分配,网页渲染

    import sqlite3
    
    from flask import Flask,render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def first():  # put application's code here
        return render_template("index-1.html")
    # 每一个函数对应一个路由解析
    @app.route('/index')
    def first1():
        return render_template('index-1.html')
    
    @app.route('/movie')
    def mv():
        datalist =  []
        con = sqlite3.Connection('move.db')
        cursor = con.cursor()
        sql = "select * from move250"
        data = cursor.execute(sql)
        for items in data:
            datalist.append(items)
        cursor.close()
        con.close()
    
        return render_template('about.html',mmm = datalist)
    
    @app.route('/score')
    def sc():
        x = []
        y = []
        con = sqlite3.Connection('move.db')
        cursor = con.cursor()
        sql = "select grade,count(grade) from move250 group by grade"
        data1 = cursor.execute(sql)
        for ite in data1:
           x.append(ite[0])
           y.append(ite[1])
        cursor.close()
        con.close()
        return render_template('services.html',score = x,number = y)
    
    @app.route('/word')
    def wd():
        return render_template('projects-details.html')
    
    @app.route('/team')
    def te():
        return render_template('team.html')
    
    if __name__ == '__main__':
        app.run()
    

    网页源码,由于网页源码过多,只放一页

    网页效果

    在这里插入图片描述

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <style>
            #container{
                border: 2px solid red;
                height: 1000px;
                width: 1200px;
                top: 50px;
                left: 100px;
            }
        </style>
        
        <!-- ========== Meta Tags ========== -->
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="description" content="Buskey - Corporate Business Template">
    
        <!-- ========== Page Title ========== -->
        <title>Buskey - Corporate Business Template</title>
    
        <!-- ========== Start Stylesheet ========== -->
        <link href="../static/css/plugins.min.css" rel="stylesheet">
        <link href="../static/css/flaticon-business-set.css" rel="stylesheet">
        <link href="../static/css/style.css" rel="stylesheet">
        <link href="../static/css/responsive.css" rel="stylesheet">
        <!-- ========== End Stylesheet ========== -->
    
        <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
        <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
        <!--[if lt IE 9]>
    
    
     <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
        <![endif]-->
    
        <!-- ========== Google Fonts ========== -->
        <link href="../static/css/css.css" rel="stylesheet">
        <link href="../static/css/css1.css" rel="stylesheet">
    
    </head>
    
    <body>
    
        <!-- Preloader Start -->
        <div class="se-pre-con"></div>
        <!-- Preloader Ends -->
    
        <!-- Start Header Top 
        ============================================= -->
        <div class="top-bar-area bg-theme text-light">
            <div class="container">
                <div class="row">
                    <div class="col-md-9">
                        <div class="info box">
                            <ul>
                                <li>
                                    <div class="icon">
                                        <i class="fas fa-map-marker-alt"></i>
                                    </div>
                                    <div class="info">
                                        <p>
                                            china
                                        </p>
                                    </div>
                                </li>
                                <li>
                                    <div class="icon">
                                        <i class="fas fa-envelope-open"></i>
                                    </div>
                                    <div class="info">
                                        <p>
                                            1751108164@qq.com
                                        </p>
                                    </div>
                                </li>
                                <li>
                                    <div class="icon">
                                        <i class="fas fa-mobile-alt"></i>
                                    </div>
                                    <div class="info">
                                        <p>
                                            +123 456 7890
                                        </p>
                                    </div>
                                </li>
                            </ul>
                        </div>
                    </div>
                    <div class="topbar-social col-md-3">
    
                    </div>
                </div>
            </div>
        </div>
        <!-- End Header Top -->
    
        <!-- Header 
        ============================================= -->
        <header>
    
            <!-- Start Navigation -->
            <nav class="navbar navbar-default navbar-sticky bootsnav">
    
                <div class="container">
    
                    <!-- Start Header Navigation -->
                    <div class="navbar-header">
                        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-menu">
                            <i class="fa fa-bars"></i>
                        </button>
                        <a class="navbar-brand" href="index.html">
                            <img src="../static/picture/logo-light.png" class="logo logo-display" alt="Logo">
                        </a>
                    </div>
                    <!-- End Header Navigation -->
    
                    <!-- Collect the nav links, forms, and other content for toggling -->
                    <div class="collapse navbar-collapse" id="navbar-menu">
                        <ul class="nav navbar-nav navbar-right" data-in="#" data-out="#">
                            <li class="dropdown">
                                <a href="index-1.html" class="dropdown-toggle active" data-toggle="dropdown">首页</a>
    
                            </li>
                            <li>
                                <a href="about.html">电影列表</a>
                            </li>
                            <li>
                                <a href="">评分</a>
                            </li>
                            <li class="dropdown">
                                <a href="projects-details.html" class="dropdown-toggle" data-toggle="dropdown">词云</a>
    
                            </li>
                            <li class="dropdown">
                                <a href="team.html" class="dropdown-toggle" data-toggle="dropdown">团队</a>
    
                            </li>
                        </ul>
                    </div><!-- /.navbar-collapse -->
                </div>
    
            </nav>
            <!-- End Navigation -->
    
        </header>
        <!-- End Header -->
    
        <!-- Start Breadcrumb
        ============================================= -->
        <div class="breadcrumb-area shadow dark bg-fixed text-center padding-xl text-light" style="background-image: url(../static/image/21.jpg);">
            <div class="container">
                <div class="row">
                    <div class="col-md-6 col-sm-6 text-left">
                        <h1>影线评分</h1>
                    </div>
                    <div class="col-md-6 col-sm-6 text-right">
    
                    </div>
                </div>
            </div>
        </div>
        <!-- End Breadcrumb -->
    
        <!-- Start Fun Factor -->
    
        <!-- Start Fun Factor -->
    <div class="fun-factor-area default-padding text-center bg-fixed shadow theme-hard parallax parralax-shadow" data-parallax="scroll" style="background-image: url(../static/image/12.jpg);">
            <div class="container">
                <div class="row">
                    <div class="col-md-12">
                        <a href="about.html">
                        <div class="col-md-3 col-sm-6 item">
                            <div class="fun-fact">
                                <i class="flaticon-world-map"></i>
                                <div class="timer" data-to="250" data-speed="5000"></div>
                                <span class="medium">经典电影</span>
                            </div>
                        </div>
                            </a>
                        <a href="services.html">
                        <div class="col-md-3 col-sm-6 item">
                            <div class="fun-fact">
                                <i class="flaticon-gears"></i>
                                <div class="timer" data-to="1" data-speed="5000"></div>
                                <span class="medium">评分统计</span>
                            </div>
                        </div>
                            </a>
                        <a href="projects-details.html">
                        <div class="col-md-3 col-sm-6 item">
                            <div class="fun-fact">
                                <i class="flaticon-id-card"></i>
                                <div class="timer" data-to="5693" data-speed="5000"></div>
                                <span class="medium">高频词汇</span>
                            </div>
                        </div>
                            </a>
                        <a href="team.html ">
                        <div class="col-md-3 col-sm-6 item">
                            <div class="fun-fact">
                                <i class="flaticon-id"></i>
                                <div class="timer" data-to="5" data-speed="5000"></div>
                                <span class="medium">专业团队</span>
                            </div>
                        </div>
                            </a>
                    </div>
                </div>
            </div>
        </div>
        <!-- End Fun Factor -->
        <!-- Start Services
        ============================================= -->
        <div class="carousel-services-area bg-gray">
            <div class="container-box oh">
                <div class="carousel-service-items owl-carousel owl-theme">
                    <div id="container" ></div>
                </div>
            </div>
        </div>
        <!-- End Services -->
    
        <!-- jQuery Frameworks
        ============================================= -->
    
         <!-- echarts 图表
        ============================================= -->
        <script src="../static/js/plugins.min.js"></script>
        <script src="../static/js/main.js"></script>
            <script type="text/javascript" src="echarts.min.js"></script>
            <!-- Uncomment this line if you want to dataTool extension
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/extension/dataTool.min.js"></script>
            -->
            <!-- Uncomment this line if you want to use gl extension
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-gl@2/dist/echarts-gl.min.js"></script>
            -->
            <!-- Uncomment this line if you want to echarts-stat extension
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-stat@latest/dist/ecStat.min.js"></script>
            -->
            <!-- Uncomment this line if you want to use map
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/map/js/china.js"></script>
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/map/js/world.js"></script>
            -->
            <!-- Uncomment these two lines if you want to use bmap extension
            <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=<Your Key Here>"></script>
            <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@{{version}}/dist/extension/bmap.min.js"></script>
            -->
    
            <script type="text/javascript">
    var dom = document.getElementById("container");
    var myChart = echarts.init(dom);
    var app = {};
    
    var option;
    
    option = {
      xAxis: {
        type: 'category',
        data: [8.3,8.4,8.5,8.6,8.7,8.8,8.9,9,9.1,9.2,9.3,9.4,9.5,9.6,9.7]
      },
      yAxis: {
        type: 'value'
      },
      series: [
        {
          data: [1,3,9,23,40,40,39,15,28,17,20,7,4,3,1,],
          type: 'bar',
          showBackground: true,
          backgroundStyle: {
            color: 'rgba(180, 180, 180, 0.2)'
          }
        }
      ]
    };
    
    option && myChart.setOption(option);
            </script>
    
    </body>
    </html>
    

    网页的免费模板很多,可以挑选自己喜欢的进行修改,并插入图表等。

    词云图片制作,本项目采用电影的简介制作

    # -*- codeing = utf-8 -*-
    # @Time : 2022/2/2 12:53
    # @Author : lj
    # @File : testcloud.PY
    # @Software: 4{PRODUCT_NAME}
    import jieba
    from matplotlib import pyplot as plt
    from wordcloud import WordCloud
    from PIL import Image
    import numpy as np
    import sqlite3
    # 主要的流程,1.jieba提取文字,2.生成词云
    #准备好数据
    con = sqlite3.connect('move.db')
    cur = con.cursor()
    sql = 'select introduction from move250'
    data = cur.execute(sql)
    text = ""
    for item in data:
        text = text + item[0]
    # print(text)
    cur.close()
    con.close()
    #文本分词分句
    cut = jieba.cut(text)
    r = ' '.join(cut)
    
    print(len(r))
    
    # 处理图片的
    img = Image.open(r'.\templates\TEST\img\img/ll.jpg')
    img_arrays = np.array(img)  #将图片转换为数组
    
    
    #词云库封装一个对象
    wc =WordCloud(
        background_color='white',  #输出图片的颜色
         mask=img_arrays,    #导入处理好的图片
        font_path = 'STXINWEI.TTF' #字体的文件
    )
    #词云对象处理已经分好的词
    wc.generate(r)
    
    
    #绘制图片,plt matplotlib的库别名
    fig = plt.figure(1)  #matplotlib库figure方法可绘图
    plt.imshow(wc)   #按照wc的规则显示图片
    plt.axis('off')  #不显示x轴
    
    # plt.show() #生成的词云图片
    
    #输出词云图片到文件中,设置清晰度
    plt.savefig(r'.\templates\TEST\img\img/wordcloud2.jpg',dpi=800)
    

    词云图展示:

    在这里插入图片描述

    将制作好的图片放在网页的合适网页展示即可


    在这里插入图片描述

    至此此项完成

    问题:1、爬取之后在数据库中的数据无法在网页上显示。

    2、先查看网页后在网页中跳转没有问题,但是通过端口路径访问页面之后跳转到其他网页就无法跳转。欢迎大佬指正。

    展开全文
  • 另:如果有同学只想做数据分析和可视化展示,这也没问题。以下百度网盘链接也提供了已经使用爬虫获取的数据。  环境:python(anaconda)  源码:百度网盘链接:https://pan.baidu.com/s/101ck
  • Python爬虫以及数据可视化分析

    万次阅读 多人点赞 2020-12-25 17:43:30
    Python爬虫以及数据可视化分析之B站动漫排行榜信息爬取分析 简书地址:https://www.jianshu.com/u/40ac87350697 简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析 源码文件可以参考Github上传的...

    Python爬虫以及数据可视化分析之Bilibili动漫排行榜信息爬取分析

    简书地址:https://www.jianshu.com/u/40ac87350697

    简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析

    源码文件可以参考Github上传的项目:https://github.com/Lemon-Sheep/Py/tree/master

    下面,我们开始吧!

    PS: 作为Python爬虫初学者,如有不正确的地方,望各路大神不吝赐教[抱拳]

    本项目将会对B站番剧排行的数据进行网页信息爬取以及数据可视化分析
    image.png

    首先,准备好相关库

    requests、pandas、BeautifulSoup、matplotlib等

    因为这是第三方库,所以我们需要额外下载
    下载有两种方法(以requests为例,其余库的安装方法类似):

    (一)在命令行输入

    前提:装了pip( Python 包管理工具,提供了对Python 包的查找、下载、安装、卸载的功能。 )

    pip install requests

    (二)通过PyCharm下载

    第一步:编译器左上角File–>Settings…
    image.png
    第二步:找到Project Interpreter 点击右上角加号按钮,弹出界面上方搜索库名:requests,点击左下角Install ,当提示successfully时,即安装完成。
    2.png

    image.png

    准备工作做好后,开始项目的实行

    一、获取网页内容

    def get_html(url):
        try:
            r = requests.get(url)             # 使用get来获取网页数据
            r.raise_for_status()              # 如果返回参数不为200,抛出异常
            r.encoding = r.apparent_encoding  # 获取网页编码方式
            return r.text                     # 返回获取的内容
        except:
            return '错误'
    

    我们来看爬取情况,是否有我们想要的内容:

    def main():
        url = 'https://www.bilibili.com/v/popular/rank/bangumi'    # 网址
        html = get_html(url)                                       # 获取返回值
        print(html)                                              # 打印
    
    if __name__ == '__main__':                        #入口
        main()
    

    爬取结果如下图所示:
    image.png
    成功!

    二、信息解析阶段:

    第一步,先构建BeautifulSoup实例

    soup = BeautifulSoup(html, 'html.parser') # 指定BeautifulSoup的解析器
    

    第二步,初始化要存入信息的容器

    # 定义好相关列表准备存储相关信息
        TScore = []  # 综合评分
        name = []  # 动漫名字
        play= []  # 播放量
        review = []  # 评论数
        favorite= []  # 收藏数
    

    第三步,开始信息整理
    我们先获取番剧的名字,并将它们先存进列表中

    # ********************************************  动漫名字存储
        for tag in soup.find_all('div', class_='info'):
            # print(tag)
            bf = tag.a.string
            name.append(str(bf))
        print(name)
    

    此处我们用到了beautifulsoup的find_all()来进行解析。在这里,find_all()的第一个参数是标签名,第二个是标签中的class值(注意下划线哦(class_=‘info’))。

    我们在网页界面按下F12,就能看到网页代码,找到相应位置,就能清晰地看见相关信息:
    image.png

    接着,我们用几乎相同的方法来对综合评分、播放量,评论数和收藏数来进行提取

    # ********************************************  播放量存储
        for tag in soup.find_all('div', class_='detail'):
            # print(tag)
            bf = tag.find('span', class_='data-box').get_text()
            # 统一单位为‘万’
            if '亿' in bf:
                num = float(re.search(r'\d(.\d)?', bf).group()) * 10000
                # print(num)
                bf = num
            else:
                bf = re.search(r'\d*(\.)?\d', bf).group()
            play.append(float(bf))
        print(play)
        # ********************************************  评论数存储
        for tag in soup.find_all('div', class_='detail'):
            # pl = tag.span.next_sibling.next_sibling
            pl = tag.find('span', class_='data-box').next_sibling.next_sibling.get_text()
            # *********统一单位
            if '万' not in pl:
                pl = '%.1f' % (float(pl) / 10000)
                # print(123, pl)
            else:
                pl = re.search(r'\d*(\.)?\d', pl).group()
            review.append(float(pl))
        print(review)
        # ********************************************  收藏数
        for tag in soup.find_all('div', class_='detail'):
            sc = tag.find('span', class_='data-box').next_sibling.next_sibling.next_sibling.next_sibling.get_text()
            sc = re.search(r'\d*(\.)?\d', sc).group()
            favorite.append(float(sc))
        print(favorite)
        # ********************************************  综合评分
        for tag in soup.find_all('div', class_='pts'):
            zh = tag.find('div').get_text()
            TScore.append(int(zh))
        print('综合评分', TScore)
    

    其中有个.next_sibling是用于提取同级别的相同标签信息,如若没有这个方法,当它找到第一个’span’标签之后,就不会继续找下去了(根据具体情况来叠加使用此方法);
    还用到了正则表达式来提取信息(需要导入库‘re’)

    最后我们将提取的信息,存进excel表格之中,并返回结果集

    # 存储至excel表格中
        info = {'动漫名': name, '播放量(万)': play, '评论数(万)': review,'收藏数(万)': favorite, '综合评分': TScore}
        dm_file = pandas.DataFrame(info)
        dm_file.to_excel('Dongman.xlsx', sheet_name="动漫数据分析")
        # 将所有列表返回
        return name, play, review, favorite, TScore
    

    我们可以打开文件看一看存储的信息格式(双击打开)
    image.png
    image.png
    成功!

    三、数据可视化分析

    我们先做一些基础设置
    要先准备一个文件: STHeiti Medium.ttc [注意存放在项目中的位置]
    image.png

    my_font = font_manager.FontProperties(fname='./data/STHeiti Medium.ttc')  # 设置中文字体(图表中能显示中文)
    
     # 为了坐标轴上能显示中文
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.rcParams['axes.unicode_minus'] = False
    
        dm_name = info[0]  # 番剧名
        dm_play = info[1]  # 番剧播放量
        dm_review = info[2]  # 番剧评论数
        dm_favorite = info[3]  # 番剧收藏数
        dm_com_score = info[4]  # 番剧综合评分
        # print(dm_com_score)
    

    然后,开始使用matplot来绘制图形,实现数据可视化分析
    文中有详细注释,这里就不再赘述了,聪明的你一定一看就懂了~

    # **********************************************************************综合评分和播放量对比
        # *******综合评分条形图
        fig, ax1 = plt.subplots()
        plt.bar(dm_name, dm_com_score, color='red')  #设置柱状图
        plt.title('综合评分和播放量数据分析', fontproperties=my_font)  # 表标题
        ax1.tick_params(labelsize=6)  
        plt.xlabel('番剧名')  # 横轴名
        plt.ylabel('综合评分')  # 纵轴名
        plt.xticks(rotation=90, color='green')  # 设置横坐标变量名旋转度数和颜色
    
        # *******播放量折线图
        ax2 = ax1.twinx()  # 组合图必须加这个
        ax2.plot(dm_play, color='cyan')  # 设置线粗细,节点样式
        plt.ylabel('播放量')  # y轴
    
        plt.plot(1, label='综合评分', color="red", linewidth=5.0)  # 图例
        plt.plot(1, label='播放量', color="cyan", linewidth=1.0, linestyle="-")  # 图例
        plt.legend()
    
        plt.savefig(r'E:1.png', dpi=1000, bbox_inches='tight')  #保存至本地
    
        plt.show()
    

    来看看效果

    有没有瞬间就感觉高~大~上~~了(嘿嘿~)

    然后我们用相同的方法来多绘制几个对比图:

    # **********************************************************************评论数和收藏数对比
        # ********评论数条形图
        fig, ax3 = plt.subplots()
        plt.bar(dm_name, dm_review, color='green')
        plt.title('番剧评论数和收藏数分析')
        plt.ylabel('评论数(万)')
        ax3.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******收藏数折线图
        ax4 = ax3.twinx()  # 组合图必须加这个
        ax4.plot(dm_favorite, color='yellow')  # 设置线粗细,节点样式
        plt.ylabel('收藏数(万)')
    
        plt.plot(1, label='评论数', color="green", linewidth=5.0)
        plt.plot(1, label='收藏数', color="yellow", linewidth=1.0, linestyle="-")
        plt.legend()
        plt.savefig(r'E:2.png', dpi=1000, bbox_inches='tight')
    
        # **********************************************************************综合评分和收藏数对比
        # *******综合评分条形图
        fig, ax5 = plt.subplots()
        plt.bar(dm_name, dm_com_score, color='red')
        plt.title('综合评分和收藏数量数据分析')
        plt.ylabel('综合评分')
        ax5.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******收藏折线图
        ax6 = ax5.twinx()  # 组合图必须加这个
        ax6.plot(dm_favorite, color='yellow')  # 设置线粗细,节点样式
        plt.ylabel('收藏数(万)')
        plt.plot(1, label='综合评分', color="red", linewidth=5.0)
        plt.plot(1, label='收藏数', color="yellow", linewidth=1.0, linestyle="-")
        plt.legend()
    
        plt.savefig(r'E:3.png', dpi=1000, bbox_inches='tight')
    
        # **********************************************************************播放量和评论数对比
        # *******播放量条形图
        fig, ax7 = plt.subplots()
        plt.bar(dm_name, dm_play, color='cyan')
        plt.title('播放量和评论数 数据分析')
        plt.ylabel('播放量(万)')
        ax7.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******评论数折线图
        ax8 = ax7.twinx()  # 组合图必须加这个
        ax8.plot(dm_review, color='green')  # 设置线粗细,节点样式
        plt.ylabel('评论数(万)')
        plt.plot(1, label='播放量', color="cyan", linewidth=5.0)
        plt.plot(1, label='评论数', color="green", linewidth=1.0, linestyle="-")
        plt.legend()
        plt.savefig(r'E:4.png', dpi=1000, bbox_inches='tight')
    
        plt.show()
    

    我们来看看最终效果
    image.png
    image.png

    Nice!很完美~ 大家可以根据自己的想法按照相同的方法进行数据组合分析。

    最后,附上全部代码

    import re
    import pandas
    import requests
    from bs4 import BeautifulSoup
    import matplotlib.pyplot as plt
    from matplotlib import font_manager
    
    
    def get_html(url):
        try:
            r = requests.get(url)  # 使用get来获取网页数据
            r.raise_for_status()  # 如果返回参数不为200,抛出异常
            r.encoding = r.apparent_encoding  # 获取网页编码方式
            return r.text  # 返回获取的内容
        except:
            return '错误'
    
    
    def save(html):
        # 解析网页
        soup = BeautifulSoup(html, 'html.parser')  # 指定Beautiful的解析器为“html.parser”
    
        with open('./data/B_data.txt', 'r+', encoding='UTF-8') as f:
            f.write(soup.text)
    
        # 定义好相关列表准备存储相关信息
        TScore = []  # 综合评分
        name = []  # 动漫名字
        bfl = []  # 播放量
        pls = []  # 评论数
        scs = []  # 收藏数
    
        # ********************************************  动漫名字存储
        for tag in soup.find_all('div', class_='info'):
            # print(tag)
            bf = tag.a.string
            name.append(str(bf))
        print(name)
    
        # ********************************************  播放量存储
        for tag in soup.find_all('div', class_='detail'):
            # print(tag)
            bf = tag.find('span', class_='data-box').get_text()
            # 统一单位为‘万’
            if '亿' in bf:
                num = float(re.search(r'\d(.\d)?', bf).group()) * 10000
                # print(num)
                bf = num
            else:
                bf = re.search(r'\d*(\.)?\d', bf).group()
            bfl.append(float(bf))
        print(bfl)
        # ********************************************  评论数存储
        for tag in soup.find_all('div', class_='detail'):
            # pl = tag.span.next_sibling.next_sibling
            pl = tag.find('span', class_='data-box').next_sibling.next_sibling.get_text()
            # *********统一单位
            if '万' not in pl:
                pl = '%.1f' % (float(pl) / 10000)
                # print(123, pl)
            else:
                pl = re.search(r'\d*(\.)?\d', pl).group()
            pls.append(float(pl))
        print(pls)
        # ********************************************  收藏数
        for tag in soup.find_all('div', class_='detail'):
            sc = tag.find('span', class_='data-box').next_sibling.next_sibling.next_sibling.next_sibling.get_text()
            sc = re.search(r'\d*(\.)?\d', sc).group()
            scs.append(float(sc))
        print(scs)
        # ********************************************  综合评分
        for tag in soup.find_all('div', class_='pts'):
            zh = tag.find('div').get_text()
            TScore.append(int(zh))
        print('综合评分', TScore)
    
        # 存储至excel表格中
        info = {'动漫名': name, '播放量(万)': bfl, '评论数(万)': pls, '收藏数(万)': scs, '综合评分': TScore}
        dm_file = pandas.DataFrame(info)
        dm_file.to_excel('Dongman.xlsx', sheet_name="动漫数据分析")
        # 将所有列表返回
        return name, bfl, pls, scs, TScore
    
    
    def view(info):
        my_font = font_manager.FontProperties(fname='./data/STHeiti Medium.ttc')  # 设置中文字体(图标中能显示中文)
        dm_name = info[0]  # 番剧名
        dm_play = info[1]  # 番剧播放量
        dm_review = info[2]  # 番剧评论数
        dm_favorite = info[3]  # 番剧收藏数
        dm_com_score = info[4]  # 番剧综合评分
        # print(dm_com_score)
    
        # 为了坐标轴上能显示中文
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.rcParams['axes.unicode_minus'] = False
    
        # **********************************************************************综合评分和播放量对比
        # *******综合评分条形图
        fig, ax1 = plt.subplots()
        plt.bar(dm_name, dm_com_score, color='red')  #设置柱状图
        plt.title('综合评分和播放量数据分析', fontproperties=my_font)  # 表标题
        ax1.tick_params(labelsize=6)
        plt.xlabel('番剧名')  # 横轴名
        plt.ylabel('综合评分')  # 纵轴名
        plt.xticks(rotation=90, color='green')  # 设置横坐标变量名旋转度数和颜色
    
        # *******播放量折线图
        ax2 = ax1.twinx()  # 组合图必须加这个
        ax2.plot(dm_play, color='cyan')  # 设置线粗细,节点样式
        plt.ylabel('播放量')  # y轴
    
        plt.plot(1, label='综合评分', color="red", linewidth=5.0)  # 图例
        plt.plot(1, label='播放量', color="cyan", linewidth=1.0, linestyle="-")  # 图例
        plt.legend()
    
        plt.savefig(r'E:1.png', dpi=1000, bbox_inches='tight')  #保存至本地
    
        # plt.show()
    
        # **********************************************************************评论数和收藏数对比
        # ********评论数条形图
        fig, ax3 = plt.subplots()
        plt.bar(dm_name, dm_review, color='green')
        plt.title('番剧评论数和收藏数分析')
        plt.ylabel('评论数(万)')
        ax3.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******收藏数折线图
        ax4 = ax3.twinx()  # 组合图必须加这个
        ax4.plot(dm_favorite, color='yellow')  # 设置线粗细,节点样式
        plt.ylabel('收藏数(万)')
    
        plt.plot(1, label='评论数', color="green", linewidth=5.0)
        plt.plot(1, label='收藏数', color="yellow", linewidth=1.0, linestyle="-")
        plt.legend()
        plt.savefig(r'E:2.png', dpi=1000, bbox_inches='tight')
    
        # **********************************************************************综合评分和收藏数对比
        # *******综合评分条形图
        fig, ax5 = plt.subplots()
        plt.bar(dm_name, dm_com_score, color='red')
        plt.title('综合评分和收藏数量数据分析')
        plt.ylabel('综合评分')
        ax5.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******收藏折线图
        ax6 = ax5.twinx()  # 组合图必须加这个
        ax6.plot(dm_favorite, color='yellow')  # 设置线粗细,节点样式
        plt.ylabel('收藏数(万)')
        plt.plot(1, label='综合评分', color="red", linewidth=5.0)
        plt.plot(1, label='收藏数', color="yellow", linewidth=1.0, linestyle="-")
        plt.legend()
    
        plt.savefig(r'E:3.png', dpi=1000, bbox_inches='tight')
    
        # **********************************************************************播放量和评论数对比
        # *******播放量条形图
        fig, ax7 = plt.subplots()
        plt.bar(dm_name, dm_play, color='cyan')
        plt.title('播放量和评论数 数据分析')
        plt.ylabel('播放量(万)')
        ax7.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******评论数折线图
        ax8 = ax7.twinx()  # 组合图必须加这个
        ax8.plot(dm_review, color='green')  # 设置线粗细,节点样式
        plt.ylabel('评论数(万)')
        plt.plot(1, label='播放量', color="cyan", linewidth=5.0)
        plt.plot(1, label='评论数', color="green", linewidth=1.0, linestyle="-")
        plt.legend()
        plt.savefig(r'E:4.png', dpi=1000, bbox_inches='tight')
    
        plt.show()
    
    
    def main():
        url = 'https://www.bilibili.com/v/popular/rank/bangumi'  # 网址
        html = get_html(url)  # 获取返回值
        # print(html)
        info = save(html)
        view(info)
    
    
    if __name__ == '__main__':
        main()
    

    关于图表的分析和得出的结论,这里就不描述了,一千个读者就有一千个哈姆雷特,每个人有每个人的分析描述方法,相信你们能有更加透彻的见解分析。

    以上就是关于爬虫以及数据可视化分析的内容,希望能帮到你们!
    伙伴们可以到github上查看源码文件:https://github.com/Lemon-Sheep/Py/tree/master

    喜欢记得点个赞哦~

    展开全文
  • Python爬虫数据分析可视化.rar
  • 基于Python的网络爬虫数据可视化和预测分析.pdf
  • 补档一下2020.6在家去不了学校做的疫情数据可视化 (使用Python进行爬虫+可视化输出) ** 一、 环境配置 ** 使用编程软件python3.7 代码涉及函数库: 关于警告的warnings 基础数据处理的两个函数库numpy和pandas ...

    补档一下2020.6在家去不了学校做的疫情数据可视化 (使用Python进行爬虫+可视化输出)

    **

    一、 环境配置

    **
    使用编程软件python3.7
    代码涉及函数库:
    关于警告的warnings
    基础数据处理的两个函数库numpy和pandas
    涉及网络爬虫的requests
    Java相关的json
    时间函数库time
    画图函数库pyecharts *使用版本1.7.1

    import warnings
    import numpy as np
    import pandas as pd
    import requests
    import json
    import time
    from pyecharts import options as opts
    from pyecharts.charts import Map
    from pyecharts.charts import Line
    pd.set_option('max_rows',500)
    warnings.filterwarnings('ignore')
    

    二、输入输出文件

    代码文件:疫情数据可视化.py
    输出html:
    中国疫情地图.html
    世界疫情地图.html
    广东疫情折线图.html
    美国疫情折线图.html

    三.、代码设计

    1. 网络爬虫获取数据

    编写类放所有函数
    (1)连接网站
    (2)获取数据
    (3)写入CSV存储
    (4)获取全国各省的实时数据
    (5)获取世界实时数据
    (6)获取中国历史疫情数据
    (7)获取特定省的疫情数据
    (8)获取特定国家疫情数据
    (9)获取世界各国历史数据

    '''获取疫情数据'''
    class getCOVID19(object):
        
        '''请求连接网站'''
        def connectUrl(self,url):
            '''url:要访问的网址,str'''
            
            #设置代理网站
            headers = {};
            headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
            try:
                # 使用requests发起请求
                response = requests.get(url,headers = headers)
    #            print(response.text)
                print('请求状态:',response.status_code)
                print('访问成功!!!')
            except:
                print('访问失败!!!')
                
            return response
        
        
        '''获取所有数据'''
        def getTotalData(self,response):
            '''response:访问网站解析之后得到的文件'''
            
            # 查看网站的源代码可以看到数据为类似字典的json格式
            # 故转换为json格式
            data_json = json.loads(response.text)
    #        print('查看json格式的数据格式:\n',data_json.keys())
            # 'data'键中存放着我们需要的数据
            # 取出数据(字典格式)
            data = data_json['data']
    #        print('疫情数据:\n',data)
    #        print('取出的数据的键:\n',data.keys())
            '''
                chinaTotal:全国当日数据
                chinaDayList:全国历史数据
                lastUpdateTime:更新时间
                areaTree:世界各地实时数据
            '''    
            return data
        
        
        '''写入csv的函数'''
        def writeCSV(self,data,name):
            '''data:要写入的数据,DataFrame格式
               name:主要的文件名称
            '''
            
            file_name = name + '_' + time.strftime('%Y_%m_%d',time.\
                                               localtime(time.time())) + '.csv'
            data.to_csv(file_name,index = None,encoding = 'utf_8_sig')
            print(file_name + '保存成功')
        
        
        
        '''获取全国各省的实时数据'''
        def getTimlyChinaData(self):
            start = time.time()
            
            url = r'https://c.m.163.com/ug/api/wuhan/app/data/list-total'
            # 连接网址
            response = getCOVID19.connectUrl(self,url)
            print('网站数据大小:',len(response.text))
            # 获取数据
            data = getCOVID19.getTotalData(self,response)
            
            # 全国各省的实时数据
            provice_data = data['areaTree'][2]['children']
            '''
                provice_data是列表格式
                每个元素是一个省的实时数据,
                并且为字典格式,每个省的键名称全部相同
            '''
    #        print('每个省键名称:\n',provice_data[0].keys())
            '''
                today:各省当日数据
                total:各省当日累计数据
                extData:无任何数据,空值
                name:各省名称
                id:各省行政编号
                lastUpdateTime:更新时间
                children:各省下一级数据
            '''
            # 提取需要的数据并封装
            ##主要信息
            info = pd.DataFrame(provice_data)[['id','lastUpdateTime','name']]
            ## 生成today的数据
            today_data = pd.DataFrame([i['today'] for i in provice_data])
            ## 修改列名
            today_data.columns = ['today_' + i for i in today_data.columns]
            ## 生成total的数据
            total_data = pd.DataFrame([i['total'] for i in provice_data])
            ## 修改列名
            total_data.columns = ['total_' + i for i in total_data.columns]
            
            final_data = pd.concat([info,total_data,today_data],axis = 1)
            
    #        #写入csv文件
    #        name = 'ChinaTimly'
    #        getCOVID19.writeCSV(self,final_data,name)
            
            print('耗时:',round(time.time() - start))
            
            return final_data
            
        
        
        
        '''获取世界实时数据'''
        def getTimlyWorldData(self):
            start = time.time()
            
            url = r'https://c.m.163.com/ug/api/wuhan/app/data/list-total'
            # 连接网址
            response = getCOVID19.connectUrl(self,url)
            print('网站数据大小:',len(response.text))
            # 获取数据
            data = getCOVID19.getTotalData(self,response)
            
            # 取出实际各地的数据
            area_tree = data['areaTree']
    #        print('世界数据的键名:\n',area_tree[0])
            '''
                today	当日数据
                total	累计数据
                extData	无任何数据
                name	国家名称
                id	各国编号
                lastUpdateTime	更新时间
                children	各国下一级数据(例如省份或州)
            '''
            # 提取需要的数据并封装
            ##主要信息
            info = pd.DataFrame(area_tree)[['id','lastUpdateTime','name']]
            ## 生成today的数据
            today_data = pd.DataFrame([i['today'] for i in area_tree])
            ## 修改列名
            today_data.columns = ['today_' + i for i in today_data.columns]
            ## 生成total的数据
            total_data = pd.DataFrame([i['total'] for i in area_tree])
            ## 修改列名
            total_data.columns = ['total_' + i for i in total_data.columns]
            
            final_data = pd.concat([info,total_data,today_data],axis = 1)
            
    #        #写入csv文件
    #        name = 'WorldTimly'
    #        getCOVID19.writeCSV(self,final_data,name)
            
            print('耗时:',round(time.time() - start))
            
            return final_data
        
        
        '''获取中国历史数据'''
        def getHisChinaData(self):
            start = time.time()
            
            '''
                为了得到每个省的历史数据,
                我们只需要将各省的行政代码作为参数传入这个地址即可,如下所示:
                https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=各省行政代码
    
                例如广东省历史数据的地址为:https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=440000
    
                湖南省历史数据的地址为:https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=430000
            '''
            # 获取各省的行政代码
            timly_china = getCOVID19.getTimlyChinaData(self)
            province_info = {num:name for num,name in zip(timly_china['id'],timly_china['name'])}
            
            # 遍历各省编号
            for province_id in province_info:
                # 容错机制
                try:
                    # 按照各省的行政编号构造网址
                    url = r'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=' + province_id
                    # 连接网址
                    response = getCOVID19.connectUrl(self,url)
                    print('网站数据大小:',len(response.text))
                    data_json = json.loads(response.text)
                    
                    # 需要的主要数据
                    data = data_json['data']['list']
                    #主要信息
                    info = pd.DataFrame(data)['date']
                    # 生成today的数据
                    today_data = pd.DataFrame([i['today'] for i in data])
                    # 修改列名
                    today_data.columns = ['today_' + i for i in today_data.columns]
                    # 生成total的数据
                    total_data = pd.DataFrame([i['total'] for i in data])
                    # 修改列名
                    total_data.columns = ['total_' + i for i in total_data.columns]
                    # 合并数据
                    province_data = pd.concat([info,total_data,today_data],axis = 1)
                    # 提取数据并添加各省的名称列
                    province_data['name'] = province_info[province_id]
                    
                    # 合并数据(从湖北开始)
                    if province_id == '420000':
                        his_province = province_data
                    else:
                        his_province = pd.concat([his_province,province_data])
                    print('{0} 成功!!!大小:{1}->{2}'.format(province_info[province_id],
                                                      province_data.shape,his_province.shape))
                    
                    end = round(time.time() - start)
                    print('耗时:',end)
                    print('-'*40)
                    #设置延迟等待
                    time.sleep(5)
                
                except:
                    print('{0} 失败!!!大小:{1}->{2}'.format(province_info[province_id],
                                                      province_data.shape,his_province.shape))
                    print('-'*40)
            
    #        # 写入CSV文件
    #        name = 'HistoryChina'
    #        getCOVID19.writeCSV(self,his_province,name)
            
            final_end = round(time.time() - start)
            print('累计耗时:',final_end)
            return his_province
            
        
        
        '''获取特定省的疫情数据'''
        def getProvinceData(self,province_name):
            start = time.time()
            # 获取该省的行政代码
            timly_china = getCOVID19.getTimlyChinaData(self)
            province_info = {name:num for name,num in zip(timly_china['name'],timly_china['id'])}
            province_id = str(province_info[province_name])
            # 容错机制
            try:
                # 按照各省的行政编号构造网址
                url = r'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=' + province_id
                # 连接网址
                response = getCOVID19.connectUrl(self,url)
                print('网站数据大小:',len(response.text))
                data_json = json.loads(response.text)
                
                # 需要的主要数据
                data = data_json['data']['list']
                #主要信息
                info = pd.DataFrame(data)['date']
                # 生成today的数据
                today_data = pd.DataFrame([i['today'] for i in data])
                # 修改列名
                today_data.columns = ['today_' + i for i in today_data.columns]
                # 生成total的数据
                total_data = pd.DataFrame([i['total'] for i in data])
                # 修改列名
                total_data.columns = ['total_' + i for i in total_data.columns]
                # 合并数据
                province_data = pd.concat([info,total_data,today_data],axis = 1)
                
                print('{0} 成功!!!大小:{1}'.format(province_name,province_data.shape))
                    
                end = round(time.time() - start)
                print('耗时:',end)
                print('-'*40)
    
            except:
                print('{0} 失败!!!大小:{1}'.format(province_name,province_data.shape))
                print('-'*40)
        
            return province_data
        
        
        
        '''获取特定国家疫情数据的函数'''
        def getCountryData(self,country_name):
            start = time.time()
            # 获取该国的行政代码
            timly_world = getCOVID19.getTimlyWorldData(self)
            country_info = {name:num for name,num in zip(timly_world['name'],timly_world['id'])}
            country_id = str(country_info[country_name])
            # 容错机制
            try:
                # 按照各国的编号构造网址
                url = r'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=' + country_id
                # 连接网址
                response = getCOVID19.connectUrl(self,url)
                print('网站数据大小:',len(response.text))
                data_json = json.loads(response.text)
                    
                # 需要的主要数据
                data = data_json['data']['list']
                # 主要信息
                info = pd.DataFrame(data)['date']
                # 生成today的数据
                today_data = pd.DataFrame([i['today'] for i in data])
                # 修改列名
                today_data.columns = ['today_' + i for i in today_data.columns]
                # 生成total的数据
                total_data = pd.DataFrame([i['total'] for i in data])
                # 修改列名
                total_data.columns = ['total_' + i for i in total_data.columns]
                # 合并数据
                country_data = pd.concat([info,total_data,today_data],axis = 1)
                print('{0} 成功!!!大小:{1}'.format(country_name,country_data.shape))
                    
                end = round(time.time() - start)
                print('耗时:',end)
                print('-'*40)
                
            except:
                print('{0} 失败!!!大小:{1}'.format(country_name,country_data.shape))
                print('-'*40)
            
            
            return country_data
        
        
    
    
    
        
        '''世界各国历史数据'''
        def getHisWorldData(self):
            start = time.time()
            '''
                通过每个国家的编号访问每个国家历史数据的地址
                例如意大利历史数据网址为:https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=15
            '''
            # 获取各国的行政代码
            timly_world = getCOVID19.getTimlyWorldData(self)
            country_info = {num:name for num,name in zip(timly_world['id'],timly_world['name'])}
            
            # 遍历各国编号
            for country_id in country_info:
                # 容错机制
                try:
                    # 按照各国的编号构造网址
                    url = r'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=' + country_id
                    # 连接网址
                    response = getCOVID19.connectUrl(self,url)
                    print('网站数据大小:',len(response.text))
                    data_json = json.loads(response.text)
                    
                    # 需要的主要数据
                    data = data_json['data']['list']
                    # 主要信息
                    info = pd.DataFrame(data)['date']
                    # 生成today的数据
                    today_data = pd.DataFrame([i['today'] for i in data])
                    # 修改列名
                    today_data.columns = ['today_' + i for i in today_data.columns]
                    # 生成total的数据
                    total_data = pd.DataFrame([i['total'] for i in data])
                    # 修改列名
                    total_data.columns = ['total_' + i for i in total_data.columns]
                    # 合并数据
                    country_data = pd.concat([info,total_data,today_data],axis = 1)
                    # 提取数据并添加各国的名称列
                    country_data['name'] = country_info[country_id]
                    
                    # 合并数据(从突尼斯开始)
                    if country_id == '9577772':
                        his_world = country_data
                    else:
                        his_world = pd.concat([his_world,country_data])
                    print('{0} 成功!!!大小:{1}->{2}'.format(country_info[country_id],
                                                      country_data.shape,his_world.shape))
                    
                    end = round(time.time() - start)
                    print('耗时:',end)
                    print('-'*40)
                    #设置延迟等待
                    time.sleep(5)
                
                except:
                    print('{0} 失败!!!大小:{1}->{2}'.format(country_info[country_id],
                                                      country_data.shape,his_world.shape))
                    print('-'*40)
            
    #        # 写入CSV文件
    #        name = 'HistoryWorld'
    #        getCOVID19.writeCSV(self,his_world,name)
            
            final_end = round(time.time() - start)
            print('累计耗时:',final_end)
            return his_world
     
    

    2. 可视化

    编写类放所有函数
    (1)绘制中国地图
    (2)绘制世界地图
    (3)绘制中国疫情地图
    (4)绘制世界疫情地图
    (5)绘制疫情折线图
    (6)绘制指定省的疫情折线图
    (7)绘制指定国家的疫情折线图

    '''可视化的类''' 
    class dataVisual(object):
        
        '''绘制中国地图的函数'''
        def visualMapChina(self,page_title,current_data_dic1,current_data_dic2,current_data_dic3,time_format):
            '''
            page_title:标题,str
            current_data_dic1:今日确诊人数的[省名,数据],嵌套列表
            current_data_dic2:累计确诊人数的[省名,数据],嵌套列表
            current_data_dic3:累计死亡人数的[省名,数据],嵌套列表
            time_format:系统时间
            '''
            
            c = (
                    Map(init_opts=opts.InitOpts(page_title=page_title, bg_color="#FDF5E6",width="1200px", height="700px"))
                    .add("今日确诊人数", data_pair=current_data_dic1, maptype="china")
                    .add("累计确诊人数", data_pair=current_data_dic2, maptype="china")
                    .add("累计死亡人数", data_pair=current_data_dic3, maptype="china")
                    .set_series_opts(label_opts=opts.LabelOpts(color="#8B4C39", font_size=10))
                    .set_global_opts(
                    title_opts=opts.TitleOpts(title=page_title, subtitle="数据更新于"+time_format),
                    # 自定义的每一段的范围,以及每一段的文字,以及每一段的特别的样式
                    visualmap_opts=opts.VisualMapOpts(pieces=[
                        {"value": 0, "label": "无", "color": "#00ccFF"},
                        {"min": 1, "max": 9, "color": "#FFCCCC"},
                        {"min": 10, "max": 99, "color": "#DB5A6B"},
                        {"min": 100, "max": 499, "color": "#FF6666"},
                        {"min": 500, "max": 999, "color": "#CC2929"},
                        {"min": 1000, "max": 9999, "color": "#8C0D0D"},
                        {"min": 10000, "color": "#9d2933"}
                    ], is_piecewise=True),
                )
            )
            return c
        
        '''绘制世界地图的函数'''
        def visualMapWorld(self,page_title,current_data_dic1,current_data_dic2,current_data_dic3,time_format):
            '''
            page_title:标题,str
            current_data_dic1:今日确诊人数的[省名,数据],嵌套列表
            current_data_dic2:累计确诊人数的[省名,数据],嵌套列表
            current_data_dic3:累计死亡人数的[省名,数据],嵌套列表
            time_format:系统时间
            '''
            
            
            c = (
                    Map(init_opts=opts.InitOpts(page_title=page_title, bg_color="#FDF5E6",width="1200px", height="700px"))
                    .add("今日确诊人数", data_pair=current_data_dic1, maptype="world")
                    .add("累计确诊人数", data_pair=current_data_dic2, maptype="world")
                    .add("累计死亡人数", data_pair=current_data_dic3, maptype="world")
                    .set_series_opts(label_opts=opts.LabelOpts(color="#8B4C39", font_size=10))
                    .set_global_opts(
                    title_opts=opts.TitleOpts(title=page_title, subtitle="数据更新于"+time_format),
                    # 自定义的每一段的范围,以及每一段的文字,以及每一段的特别的样式
                    visualmap_opts=opts.VisualMapOpts(pieces=[
                        {"value": 0, "label": "无", "color": "#00ccFF"},
                        {"min": 1, "max": 9, "color": "#FFCCCC"},
                        {"min": 10, "max": 99, "color": "#DB5A6B"},
                        {"min": 100, "max": 499, "color": "#FF6666"},
                        {"min": 500, "max": 999, "color": "#CC2929"},
                        {"min": 1000, "max": 9999, "color": "#8C0D0D"},
                        {"min": 10000, "color": "#9d2933"}
                    ], is_piecewise=True),
                )
            )
            return c
        
        
        '''绘制中国疫情地图的函数'''
        def nCoV2019MapChina(self):
            # 获取中国实时数据
            timly_china = getCOVID19.getTimlyChinaData(self)
            # 今日确诊数据
            data1 = timly_china[['name','today_confirm']]
            data1['today_confirm'].replace(np.nan,'0',inplace=True)
            current_data_dic1 = []
            for i in range(len(data1)):
                pcurrent_data_dic=[]
                area = data1.iloc[i]['name']
                pcurrent_data_dic.append(area)
                confirm = int(data1.iloc[i]['today_confirm'])
                pcurrent_data_dic.append(confirm)
                current_data_dic1.append(pcurrent_data_dic)
            # 累计确诊数据
            data2 = timly_china[['name','total_confirm']]
            data2['total_confirm'].replace(np.nan,'0',inplace=True)
            current_data_dic2 = []
            for i in range(len(data2)):
                pcurrent_data_dic=[]
                area = data2.iloc[i]['name']
                pcurrent_data_dic.append(area)
                confirm = int(data2.iloc[i]['total_confirm'])
                pcurrent_data_dic.append(confirm)
                current_data_dic2.append(pcurrent_data_dic)
            # 累计死亡数据
            data3 = timly_china[['name','total_dead']]
            data3['total_dead'].replace(np.nan,'0',inplace=True)
            current_data_dic3 = []
            for i in range(len(data3)):
                pcurrent_data_dic=[]
                area = data3.iloc[i]['name']
                pcurrent_data_dic.append(area)
                confirm = int(data3.iloc[i]['total_dead'])
                pcurrent_data_dic.append(confirm)
                current_data_dic3.append(pcurrent_data_dic)
                
                
            time_format = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            page_title = "中国疫情地图"
            dataVisual.visualMapChina(self,page_title,
                                      current_data_dic1,current_data_dic2,current_data_dic3,
                                      time_format).render("中国疫情地图.html")
            print('地图已完成!!!请在文件夹内查看。')
        
        
        
        '''国家名中英对照字典'''
        def nameMap(self):
            name_map = {'新加坡': 'Singapore Rep.', 
                        '多米尼加': 'Dominican Rep.', 
                        '巴勒斯坦': 'Palestine', 
                        '巴哈马': 'The Bahamas', 
                        '东帝汶': 'East Timor', 
                        '阿富汗': 'Afghanistan', 
                        '几内亚比绍': 'Guinea Bissau', 
                        '科特迪瓦': "Côte d'Ivoire", 
                        '锡亚琴冰川': 'Siachen Glacier', 
                        '英属印度洋领土': 'Br. Indian Ocean Ter.', 
                        '安哥拉': 'Angola', 
                        '阿尔巴尼亚': 'Albania', 
                        '阿联酋': 'United Arab Emirates', 
                        '阿根廷': 'Argentina', 
                        '亚美尼亚': 'Armenia', 
                        '法属南半球和南极领地': 'French Southern and Antarctic Lands', 
                        '澳大利亚': 'Australia', 
                        '奥地利': 'Austria', 
                        '阿塞拜疆': 'Azerbaijan', 
                        '布隆迪': 'Burundi', 
                        '比利时': 'Belgium', 
                        '贝宁': 'Benin', 
                        '布基纳法索': 'Burkina Faso', 
                        '孟加拉国': 'Bangladesh', 
                        '保加利亚': 'Bulgaria', 
                        '波斯尼亚和黑塞哥维那': 'Bosnia and Herz.', 
                        '白俄罗斯': 'Belarus', 
                        '伯利兹': 'Belize', 
                        '百慕大': 'Bermuda', 
                        '玻利维亚': 'Bolivia', 
                        '巴西': 'Brazil', 
                        '文莱': 'Brunei', 
                        '不丹': 'Bhutan', 
                        '博茨瓦纳': 'Botswana', 
                        '中非': 'Central African Rep.', 
                        '加拿大': 'Canada', 
                        '瑞士': 'Switzerland', 
                        '智利': 'Chile', 
                        '中国': 'China', 
                        '象牙海岸': 'Ivory Coast', 
                        '喀麦隆': 'Cameroon', 
                        '刚果民主共和国': 'Dem. Rep. Congo', 
                        '刚果': 'Congo', 
                        '哥伦比亚': 'Colombia', 
                        '哥斯达黎加': 'Costa Rica', 
                        '古巴': 'Cuba', 
                        '北塞浦路斯': 'N. Cyprus', 
                        '塞浦路斯': 'Cyprus', 
                        '捷克': 'Czech Rep.', 
                        '德国': 'Germany', 
                        '吉布提': 'Djibouti', 
                        '丹麦': 'Denmark', 
                        '阿尔及利亚': 'Algeria', 
                        '厄瓜多尔': 'Ecuador', 
                        '埃及': 'Egypt', 
                        '厄立特里亚': 'Eritrea', 
                        '西班牙': 'Spain', 
                        '爱沙尼亚': 'Estonia', 
                        '埃塞俄比亚': 'Ethiopia', 
                        '芬兰': 'Finland', 
                        '斐': 'Fiji', 
                        '福克兰群岛': 'Falkland Islands', 
                        '法国': 'France', 
                        '加蓬': 'Gabon', 
                        '英国': 'United Kingdom', 
                        '格鲁吉亚': 'Georgia', 
                        '加纳': 'Ghana', 
                        '几内亚': 'Guinea', 
                        '冈比亚': 'Gambia', 
                        '赤道几内亚': 'Eq. Guinea', 
                        '希腊': 'Greece', 
                        '格陵兰': 'Greenland', 
                        '危地马拉': 'Guatemala', 
                        '法属圭亚那': 'French Guiana', 
                        '圭亚那': 'Guyana', 
                        '洪都拉斯': 'Honduras', 
                        '克罗地亚': 'Croatia', 
                        '海地': 'Haiti', 
                        '匈牙利': 'Hungary', 
                        '印度尼西亚': 'Indonesia', 
                        '印度': 'India', 
                        '爱尔兰': 'Ireland', 
                        '伊朗': 'Iran', 
                        '伊拉克': 'Iraq', 
                        '冰岛': 'Iceland', 
                        '以色列': 'Israel', 
                        '意大利': 'Italy', 
                        '牙买加': 'Jamaica', 
                        '约旦': 'Jordan',
                        '日本':'Japan',
                        '日本本土': 'Japan', 
                        '哈萨克斯坦': 'Kazakhstan', 
                        '肯尼亚': 'Kenya', 
                        '吉尔吉斯斯坦': 'Kyrgyzstan', 
                        '柬埔寨': 'Cambodia', 
                        '韩国': 'Korea', 
                        '科索沃': 'Kosovo', 
                        '科威特': 'Kuwait', 
                        '老挝': 'Lao PDR', 
                        '黎巴嫩': 'Lebanon', 
                        '利比里亚': 'Liberia', 
                        '利比亚': 'Libya', 
                        '斯里兰卡': 'Sri Lanka', 
                        '莱索托': 'Lesotho', 
                        '立陶宛': 'Lithuania', 
                        '卢森堡': 'Luxembourg', 
                        '拉脱维亚': 'Latvia', 
                        '摩洛哥': 'Morocco', 
                        '摩尔多瓦': 'Moldova', 
                        '马达加斯加': 'Madagascar', 
                        '墨西哥': 'Mexico', 
                        '马其顿': 'Macedonia', 
                        '马里': 'Mali', 
                        '缅甸': 'Myanmar', 
                        '黑山': 'Montenegro', 
                        '蒙古': 'Mongolia', 
                        '莫桑比克': 'Mozambique', 
                        '毛里塔尼亚': 'Mauritania', 
                        '马拉维': 'Malawi', 
                        '马来西亚': 'Malaysia', 
                        '纳米比亚': 'Namibia', 
                        '新喀里多尼亚': 'New Caledonia', 
                        '尼日尔': 'Niger', 
                        '尼日利亚': 'Nigeria', 
                        '尼加拉瓜': 'Nicaragua', 
                        '荷兰': 'Netherlands', 
                        '挪威': 'Norway', 
                        '尼泊尔': 'Nepal', 
                        '新西兰': 'New Zealand', 
                        '阿曼': 'Oman', 
                        '巴基斯坦': 'Pakistan', 
                        '巴拿马': 'Panama', 
                        '秘鲁': 'Peru', 
                        '菲律宾': 'Philippines', 
                        '巴布亚新几内亚': 'Papua New Guinea', 
                        '波兰': 'Poland', 
                        '波多黎各': 'Puerto Rico', 
                        '朝鲜': 'Dem. Rep. Korea', 
                        '葡萄牙': 'Portugal', 
                        '巴拉圭': 'Paraguay', 
                        '卡塔尔': 'Qatar', 
                        '罗马尼亚': 'Romania', 
                        '俄罗斯': 'Russia', 
                        '卢旺达': 'Rwanda', 
                        '西撒哈拉': 'W. Sahara', 
                        '沙特阿拉伯': 'Saudi Arabia', 
                        '苏丹': 'Sudan', 
                        '南苏丹': 'S. Sudan', 
                        '塞内加尔': 'Senegal', 
                        '所罗门群岛': 'Solomon Is.', 
                        '塞拉利昂': 'Sierra Leone', 
                        '萨尔瓦多': 'El Salvador', 
                        '索马里兰': 'Somaliland', 
                        '索马里': 'Somalia', 
                        '塞尔维亚': 'Serbia', 
                        '苏里南': 'Suriname', 
                        '斯洛伐克': 'Slovakia', 
                        '斯洛文尼亚': 'Slovenia', 
                        '瑞典': 'Sweden', 
                        '斯威士兰': 'Swaziland', 
                        '叙利亚': 'Syria', 
                        '乍得': 'Chad', 
                        '多哥': 'Togo', 
                        '泰国': 'Thailand', 
                        '塔吉克斯坦': 'Tajikistan', 
                        '土库曼斯坦': 'Turkmenistan', 
                        '特里尼达和多巴哥': 'Trinidad and Tobago', 
                        '突尼斯': 'Tunisia', 
                        '土耳其': 'Turkey', 
                        '坦桑尼亚': 'Tanzania', 
                        '乌干达': 'Uganda', 
                        '乌克兰': 'Ukraine', 
                        '乌拉圭': 'Uruguay', 
                        '美国': 'United States', 
                        '乌兹别克斯坦': 'Uzbekistan', 
                        '委内瑞拉': 'Venezuela', 
                        '越南': 'Vietnam', 
                        '瓦努阿图': 'Vanuatu', 
                        '西岸': 'West Bank', 
                        '也门': 'Yemen', 
                        '南非': 'South Africa', 
                        '赞比亚': 'Zambia', 
                        '津巴布韦': 'Zimbabwe'}
            return name_map
        
        
        
        '''绘制世界疫情地图的函数'''
        def nCoV2019MapWorld(self):
            # 读取国家中英对照字典
            name_map = dataVisual.nameMap(self)
            # 获取全球的实时数据
            timly_world = getCOVID19.getTimlyWorldData(self)
            # 今日确诊数据
            data1 = timly_world[['name','today_confirm']]
            data1['today_confirm'].replace(np.nan,'0',inplace=True)
            current_data_dic1 = []
            for i in range(len(data1)):
                pcurrent_data_dic=[]
                if data1.iloc[i]['name'] in list(name_map.keys()):
                    area = name_map[data1.iloc[i]['name']]
                    pcurrent_data_dic.append(area)
                    confirm = int(data1.iloc[i]['today_confirm'])
                    pcurrent_data_dic.append(confirm)
                    current_data_dic1.append(pcurrent_data_dic)
            # 累计确诊数据
            data2 = timly_world[['name','total_confirm']]
            data2['total_confirm'].replace(np.nan,'0',inplace=True)
            current_data_dic2 = []
            for i in range(len(data2)):
                pcurrent_data_dic=[]
                if data2.iloc[i]['name'] in list(name_map.keys()):
                    area = name_map[data2.iloc[i]['name']]
                    pcurrent_data_dic.append(area)
                    confirm = int(data2.iloc[i]['total_confirm'])
                    pcurrent_data_dic.append(confirm)
                    current_data_dic2.append(pcurrent_data_dic)
            # 累计死亡数据
            data3 = timly_world[['name','total_dead']]
            data3['total_dead'].replace(np.nan,'0',inplace=True)
            current_data_dic3 = []
            for i in range(len(data3)):
                pcurrent_data_dic=[]
                if data3.iloc[i]['name'] in list(name_map.keys()):
                    area = name_map[data3.iloc[i]['name']]
                    pcurrent_data_dic.append(area)
                    confirm = int(data3.iloc[i]['total_dead'])
                    pcurrent_data_dic.append(confirm)
                    current_data_dic3.append(pcurrent_data_dic)
                
                
            time_format = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            page_title = "世界疫情地图"
            dataVisual.visualMapWorld(self,page_title,
                                      current_data_dic1,current_data_dic2,current_data_dic3,
                                      time_format).render("世界疫情地图.html")
            print('地图已完成!!!请在文件夹内查看。')
            
            
            
            
        '''画疫情折线图的函数'''
        def nCoV2019Line(self,title_name,date,total_confirm,today_confirm,total_dead,total_heal):
            '''
            title_name:标题,str
            date:日期,列表
            total_confirm:累计确诊人数,列表
            today_confirm:今日确诊人数,列表
            total_dead:累计期望人数
            total_heal:累计治愈人数
            '''
            
            line = (
                Line()
                .add_xaxis(date)
                .add_yaxis('累计确诊人数',total_confirm,is_smooth=True)
                .add_yaxis('今日确诊人数',today_confirm,is_smooth=True)
                .add_yaxis('累计死亡人数',total_dead,is_smooth=True)
                .add_yaxis('累计治愈人数',total_heal,is_smooth=True)
                .set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)), # 设置x轴标签旋转角度
                         yaxis_opts=opts.AxisOpts(name='人数', min_=0), 
                         title_opts=opts.TitleOpts(title=title_name)) 
    
                
                )
            return line
            
        
        '''画指定省折线图的函数'''
        def nCoV2019ProvinceLine(self,name):
            # 获取指定地区的数据
            his_data = getCOVID19.getProvinceData(self,name)
            # 日期
            date = his_data['date'].tolist()
            # 累计确诊
            total_confirm = his_data['total_confirm'].tolist()
            # 今日确诊
            today_confirm = his_data['today_confirm'].tolist()
            # 累计死亡
            total_dead = his_data['total_dead'].tolist()
            # 累计治愈
            total_heal = his_data['total_heal'].tolist()
            
            title_name = name + '疫情折线图'
            
            # 画折线图
            dataVisual.nCoV2019Line(self,title_name,date,
                                    total_confirm,today_confirm,total_dead,total_heal
                                    ).render(title_name+'.html')
            print('折线图已完成!!!请在文件夹内查看。')
            
            
            
        '''画指定地区折线图的函数'''
        def nCoV2019CountryLine(self,name):
            # 获取指定地区的数据
            his_data = getCOVID19.getCountryData(self,name)
            # 日期
            date = his_data['date'].tolist()
            # 累计确诊
            total_confirm = his_data['total_confirm'].tolist()
            # 今日确诊
            today_confirm = his_data['today_confirm'].tolist()
            # 累计死亡
            total_dead = his_data['total_dead'].tolist()
            # 累计治愈
            total_heal = his_data['total_heal'].tolist()
            
            title_name = name + '疫情折线图'
            
            # 画折线图
            dataVisual.nCoV2019Line(self,title_name,date,
                                    total_confirm,today_confirm,total_dead,total_heal
                                    ).render(title_name+'.html')
            print('折线图已完成!!!请在文件夹内查看。')
            
    

    3. 主函数可视化交互菜单

    if __name__ == '__main__':
        
        # 调用大类
        COVID19 = getCOVID19()
        VISUAL = dataVisual()
        
        # 交互菜单
        while True:
            print('-'*40)
            print('新冠病毒疫情数据可视化'.center(25))
            print('-'*40)
            print('目录'.center(32))
            print('查看中国疫情地图请输入:1'.center(28))
            print('查看世界疫情地图请输入:2'.center(28))
            print('查看指定省疫情折线图请输入:3'.center(30))
            print('查看指定国家的疫情折线图请输入:4'.center(32))
            print('退出菜单请输入:q'.center(23))
            print('-'*40)
             
            code = input('请输入数字:')
            if code == '1':
                VISUAL.nCoV2019MapChina()
            if code == '2':
                VISUAL.nCoV2019MapWorld()
            if code == '3':
                name = input('请输入你想查看的省(e.g.湖北):')
                VISUAL.nCoV2019ProvinceLine(name)
            if code == '4':
                name = input('请输入你想查看的国家(e.g.意大利):')
                VISUAL.nCoV2019CountryLine(name)
            if code == 'q':
                print('-'*40)
                print('谢谢使用!!!'.center(23))
                print('-'*40)
                break
    

    四、 可视化展示

    运行程序
    在这里插入图片描述

    1.查看中国疫情地图

    在这里插入图片描述
    存放代码文件的文件夹下会有一个html文件
    在这里插入图片描述
    双击打开查看:
    在这里插入图片描述
    有3种数据可视化(通过正上方的按钮交互)
    (1)今日确诊人数
    在这里插入图片描述
    (2)累计确诊人数
    在这里插入图片描述
    (3)累计死亡人数
    在这里插入图片描述

    2.查看世界疫情地图

    在这里插入图片描述
    存放代码文件的文件夹下会有一个html文件
    在这里插入图片描述
    双击打开查看:
    在这里插入图片描述

    有3种数据可视化(通过正上方的按钮交互)
    (1)今日确诊人数
    在这里插入图片描述
    (2)累计确诊人数
    在这里插入图片描述
    (3)累计死亡人数
    在这里插入图片描述

    3.查看指定省的疫情数据折线图

    在这里插入图片描述(这里以广东为例:)
    在这里插入图片描述
    在存放代码文件的文件夹下会有一个html文件
    在这里插入图片描述双击打开查看:
    在这里插入图片描述
    有4种数据可视化(通过正上方的按钮交互)
    (1)累计确诊人数
    在这里插入图片描述
    (2)今日确诊人数
    在这里插入图片描述

    (3)累计死亡人数
    在这里插入图片描述
    (4)累计治愈人数
    在这里插入图片描述

    4.查看指定国家的疫情数据折线图

    在这里插入图片描述(这里以美国为例)
    在这里插入图片描述在存放代码文件的文件夹下会有一个html文件
    在这里插入图片描述双击打开查看:
    在这里插入图片描述有4种数据可视化(通过正上方的按钮交互)
    (1)累计确诊人数
    在这里插入图片描述
    (2)今日确诊人数
    在这里插入图片描述
    (3)累计死亡人数
    在这里插入图片描述
    (4)累计治愈人数
    在这里插入图片描述

    展开全文
  • 爬取安居客房屋名称和价格等各个字段,数据存储excel表格,然后读取数据可视化。不懂的可以私聊问我
  • Python 网络爬虫数据可视化

    千次阅读 多人点赞 2021-01-11 18:47:13
    1.3 数据可视化 2 1.4 Python环境介绍 2 1.4.1 简介 2 1.4.2 特点 3 1.5 扩展库介绍 3 1.5.1 安装模块 3 1.5.2 主要模块介绍 3 ① pandas模块 3 ② requests模块 4 ③ bs4模块 4 ④ selenium模块 4 ⑤ matplotlib...
  • python 疫情数据可视化

    2020-12-21 12:29:47
    json数据转 csv import json import time import csv file = open('DXYArea-TimeSeries.json','r',encoding='utf-8') infos = json.load(file) with open('data.csv','a',newline='') as f: writer = csv....
  • Python爬虫数据可视化总结

    千次阅读 2021-09-15 19:43:41
    工具: Python,Flask,JS,CSS,HTML,WordCloud 爬取数据并存入数据库 一.导入需要的包 from bs4 import BeautifulSoup # 网页解析,获取数据 import re # 正则表达式,进行文字匹配 import xlwt # 进行excel操作 import ...
  • python爬虫及其可视化

    千次阅读 2020-12-26 11:08:43
    使用pyarm中的flask框架搭建可视化平台,使用sqlite数据库的数据制作简单的网页,并制作折线图、柱状图、散点图等等。 二、数据爬取 1.引入库 代码如下: from bs4 import BeautifulSoup import re import urllib....
  • python 爬虫数据可视化

    千次阅读 多人点赞 2020-07-08 11:37:12
    python 爬虫数据可视化 1.引言 Web已经成为日新月异迅速发展的网络信息技术中的信息载体,如何有效地提取和利用搜索引擎获得互联网最有用的、可以免费公开访问的数据集,查找用户所需的价值数据或者相近的价值...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,821
精华内容 13,128
关键字:

python爬虫数据可视化