精华内容
下载资源
问答
  • 数据结构可视化演示

    2017-03-27 09:18:55
    旧金山大学数据结构可视化演示
  • Python疫情数据爬取与可视化展示

    万次阅读 多人点赞 2021-03-19 22:16:26
    疫情数据爬取与可视化展示 使用Python爬取腾讯新闻疫情数据,并使用pyecharts可视化,绘制国内、国际日增长人数地图,matplotlib绘制方寸图。 随笔记录所的所学,此博客为我记录文章所用,发布到此,仅供网友阅读...

    疫情数据爬取与可视化展示

    使用Python爬取腾讯新闻疫情数据,并使用pyecharts可视化,绘制国内、国际日增长人数地图,matplotlib绘制方寸图。

    随笔记录所的所学,此博客为我记录文章所用,发布到此,仅供网友阅读参考。作者:北山啦

    写在前面:这个已经不是什么新鲜的话题了,所以请大佬勿喷

    导入相关模块

    import time
    import json
    import requests
    from datetime import datetime
    import pandas as pd
    import numpy as np
    

    1. 疫情数据抓取

    通过腾讯新闻公布的数据进行爬取

    网址:https://news.qq.com/zt2020/page/feiyan.htm#/

    对于静态网页,我们只需要把网页地址栏中的url传到get请求中就可以轻松地获取到网页的数据。 对于动态网页抓取的关键是先分析网页数据获取和跳转的逻辑,再去写代码 。

    右击检查,选择Network,Ctrl+R即可
    在这里插入图片描述

    记得安装快速第三方库

    pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
    

    快速下载模块

    # 定义抓取数据函数:https://beishan.blog.csdn.net/
    def Domestic():
        url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
        reponse = requests.get(url=url).json()
        data = json.loads(reponse['data'])
        return data
    
    
    def Oversea():
        url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_foreign'
        reponse = requests.get(url=url).json()
        data = json.loads(reponse['data'])
        return data
    
    
    domestic = Domestic()
    oversea = Oversea()
    
    print(domestic.keys())
    print(oversea.keys())
    
    dict_keys(['lastUpdateTime', 'chinaTotal', 'chinaAdd', 'isShowAdd', 'showAddSwitch', 'areaTree'])
    dict_keys(['foreignList', 'globalStatis', 'globalDailyHistory', 'importStatis', 'countryAddConfirmRankList', 'countryConfirmWeekCompareRankList', 'continentStatis'])
    

    2. 初步分析

    提取各地区数据明细

    # 提取各地区数据明细
    areaTree = domestic['areaTree']
    # 查看并分析具体数据
    areaTree
    

    提取国外地区数据明细

    # 提取国外地区数据明细
    foreignList = oversea['foreignList']
    # 查看并分析具体数据
    foreignList
    

    就可以看到在json数据存储的结构了

    3. 数据处理

    3.1 国内各省疫情数据提取

    # Adresss:https://beishan.blog.csdn.net/
    china_data = areaTree[0]['children'] 
    china_list = []
    for a in range(len(china_data)):
        province = china_data[a]['name']  
        confirm = china_data[a]['total']['confirm'] 
        heal = china_data[a]['total']['heal']  
        dead = china_data[a]['total']['dead']  
        nowConfirm = confirm - heal - dead 
        china_dict = {} 
        china_dict['province'] = province  
        china_dict['nowConfirm'] = nowConfirm 
        china_list.append(china_dict) 
    
    china_data = pd.DataFrame(china_list) 
    china_data.to_excel("国内疫情.xlsx", index=False) #存储为EXCEL文件
    china_data.head()
    
    provincenowConfirm
    0香港323
    1上海40
    2四川34
    3台湾30
    4广东29

    3.2 国际疫情数据提取

    world_data = foreignList  
    world_list = []  
    
    for a in range(len(world_data)):
        # 提取数据
        country = world_data[a]['name']
        nowConfirm = world_data[a]['nowConfirm']  
        confirm = world_data[a]['confirm']
        dead = world_data[a]['dead']  
        heal = world_data[a]['heal'] 
        # 存放数据
        world_dict = {}
        world_dict['country'] = country
        world_dict['nowConfirm'] = nowConfirm
        world_dict['confirm'] = confirm
        world_dict['dead'] = dead
        world_dict['heal'] = heal
        world_list.append(world_dict)
    
    world_data = pd.DataFrame(world_list)
    world_data.to_excel("国外疫情.xlsx", index=False)
    world_data.head()
    
    countrynowConfirmconfirmdeadheal
    0美国72826113035888055247022523799
    1西班牙1939763212332729102945446
    2法国2166003240525557671181581
    3秘鲁11194042218319408290835
    4英国9001110414513759375

    3.3 数据整合

    将国内数据和海外数据合并

    查询数据中是否含有中国疫情数据

    world_data.loc[world_data['country'] == "中国"]
    
    countrynowConfirmconfirmdeadheal

    从新增areaTree中提取中国数据,并添加至world_data

    confirm = areaTree[0]['total']['confirm']  # 提取中国累计确诊数据
    heal = areaTree[0]['total']['heal']  # 提取中国累计治愈数据
    dead = areaTree[0]['total']['dead']  # 提取中国累计死亡数据
    nowConfirm = confirm - heal - dead  # 计算中国现有确诊数量
    
    world_data = world_data.append(
        {
            'country': "中国",
            'nowConfirm': nowConfirm,
            'confirm': confirm,
            'heal': heal,
            'dead': dead
        },
        ignore_index=True)
    

    再次查询数据中是否含有中国疫情数据

    world_data.loc[world_data['country'] == "中国"]
    
    countrynowConfirmconfirmdeadheal
    161中国518102479484997112

    4. 可视化展示

    4.1 国内疫情态势可视化

    导入pyecharts相关库

    快速掌握数据可视化工具pyecharts

    import pyecharts.options as opts
    from pyecharts.charts import Map
    from pyecharts.globals import CurrentConfig, NotebookType
    CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
    

    国内各地区现有确诊人数地图

    m = Map()
    m.add("", [
        list(z)
        for z in zip(list(china_data["province"]), list(china_data["nowConfirm"]))
    ],
          maptype="china",
          is_map_symbol_show=False)
    m.set_global_opts(
        title_opts=opts.TitleOpts(title="COVID-19中国现有地区现有确诊人数地图"),
        visualmap_opts=opts.VisualMapOpts(
            is_piecewise=True,
            pieces=[
                {
                    "min": 5000,
                    "label": '>5000',
                    "color": "#893448"
                },  # 不指定 max,表示 max 为无限大
                {
                    "min": 1000,
                    "max": 4999,
                    "label": '1000-4999',
                    "color": "#ff585e"
                },
                {
                    "min": 500,
                    "max": 999,
                    "label": '500-1000',
                    "color": "#fb8146"
                },
                {
                    "min": 101,
                    "max": 499,
                    "label": '101-499',
                    "color": "#ffA500"
                },
                {
                    "min": 10,
                    "max": 100,
                    "label": '10-100',
                    "color": "#ffb248"
                },
                {
                    "min": 1,
                    "max": 9,
                    "label": '1-9',
                    "color": "#fff2d1"
                },
                {
                    "max": 1,
                    "label": '0',
                    "color": "#ffffff"
                }
            ]))
    m.render_notebook()
    

    在这里插入图片描述

    4.2 国际疫情态势可视化

    将各国的中文名称转换成英文名称,使用pandas中的merge方法

    pd.merge( left, right, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(’_x’, ‘_y’), copy=True, indicator=False, validate=None,)

    how: One of ‘left’, ‘right’, ‘outer’, ‘inner’. 默认inner。inner是取交集,outer取并集

    world_name = pd.read_excel("国家中英文对照表.xlsx")
    world_data_t = pd.merge(world_data,
                            world_name,
                            left_on="country",
                            right_on="中文",
                            how="inner")
    
    world_data_t
    
    countrynowConfirmconfirmdeadheal英文中文
    0美国72826113035888055247022523799United States美国
    1西班牙1939763212332729102945446Spain西班牙
    2法国2166003240525557671181581France法国
    3秘鲁11194042218319408290835Peru秘鲁
    4英国9001110414513759375United Kingdom英国
    ........................
    164伯利兹2200Belize伯利兹
    165东帝汶1100Timor-Leste东帝汶
    166东帝汶1100East Timor东帝汶
    167巴布亚新几内亚1100Papua New Guinea巴布亚新几内亚
    168中国518102479484997112China中国

    169 rows × 7 columns

    世界各国现有确诊人数地图

    m2 = Map()
    m2.add("", [
        list(z)
        for z in zip(list(world_data_t["英文"]), list(world_data_t["nowConfirm"]))
    ],
           maptype="world",
           is_map_symbol_show=False)
    m2.set_global_opts(title_opts=opts.TitleOpts(title="COVID-19世界各国现有确诊人数地图"),
                       visualmap_opts=opts.VisualMapOpts(is_piecewise=True,
                                                         pieces=[{
                                                             "min": 5000,
                                                             "label": '>5000',
                                                             "color": "#893448"
                                                         }, {
                                                             "min": 1000,
                                                             "max": 4999,
                                                             "label": '1000-4999',
                                                             "color": "#ff585e"
                                                         }, {
                                                             "min": 500,
                                                             "max": 999,
                                                             "label": '500-1000',
                                                             "color": "#fb8146"
                                                         }, {
                                                             "min": 101,
                                                             "max": 499,
                                                             "label": '101-499',
                                                             "color": "#ffA500"
                                                         }, {
                                                             "min": 10,
                                                             "max": 100,
                                                             "label": '10-100',
                                                             "color": "#ffb248"
                                                         }, {
                                                             "min": 0,
                                                             "max": 9,
                                                             "label": '0-9',
                                                             "color": "#fff2d1"
                                                         }]))
    """取消显示国家名称"""
    m2.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    m2.render_notebook()
    

    在这里插入图片描述

    4.3 国内疫情方寸间

    单独取出中国疫情数据

    # 单独取出中国疫情数据
    China_data = world_data.loc[world_data['country'] == "中国"]
    
    # 使索引从0开始递增
    China_data.reset_index(drop=True, inplace=True)
    
    China_data
    
    countrynowConfirmconfirmdeadheal
    0中国518102479484997112

    提取China_data的累计确诊、累计治愈与累计死亡数据

    # 提取China_data的累计确诊、累计治愈与累计死亡数据
    # data.at[n,'name']代表根据行索引和列名,获取对应元素的值
    w_confirm = China_data.at[0, 'confirm']
    w_heal = China_data.at[0, 'heal']
    w_dead = China_data.at[0, 'dead']
    

    导入matplotlib相关库

    import matplotlib.pyplot as plt
    import matplotlib.patches as patches
    

    构建国内疫情方寸间图示

    # -*- coding: utf-8 -*-
    %matplotlib inline
    
    fig1 = plt.figure()
    
    ax1 = fig1.add_subplot(111, aspect='equal', facecolor='#fafaf0')
    ax1.set_xlim(-w_confirm / 2, w_confirm / 2)
    ax1.set_ylim(-w_confirm / 2, w_confirm / 2)
    ax1.spines['top'].set_color('none')
    ax1.spines['right'].set_color('none')
    ax1.spines['bottom'].set_position(('data', 0))
    ax1.spines['left'].set_position(('data', 0))
    ax1.set_xticks([])
    ax1.set_yticks([])
    
    p0 = patches.Rectangle((-w_confirm / 2, -w_confirm / 2),
                           width=w_confirm,
                           height=w_confirm,
                           facecolor='#29648c',
                           label='confirm')
    p1 = patches.Rectangle((-w_heal / 2, -w_heal / 2),
                           width=w_heal,
                           height=w_heal,
                           facecolor='#69c864',
                           label='heal')
    p2 = patches.Rectangle((-w_dead / 2, -w_dead / 2),
                           width=w_dead,
                           height=w_dead,
                           facecolor='#000000',
                           label='dead')
    
    plt.gca().add_patch(p0)
    plt.gca().add_patch(p1)
    plt.gca().add_patch(p2)
    plt.title('COVID-19 Square - China', fontdict={'size': 20})
    plt.legend(loc='best')
    plt.show()
    

    在这里插入图片描述

    4.4 国际疫情方寸间

    重新排序数据

    world_data.sort_values("confirm", ascending=False, inplace=True)
    world_data.reset_index(drop=True, inplace=True)
    world_data
    
    countrynowConfirmconfirmdeadheal
    0美国72826113035888055247022523799
    1西班牙1939763212332729102945446
    2法国2166003240525557671181581
    3秘鲁11194042218319408290835
    4英国9001110414513759375
    ..................
    157利比里亚3300
    158几内亚比绍2200
    159伯利兹2200
    160东帝汶1100
    161巴布亚新几内亚1100

    162 rows × 5 columns

    构建国际疫情方寸间图示

    # -*- coding: utf-8 -*-
    plt.rcParams['font.sans-serif'] = [u'SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    fig1 = plt.figure(figsize=(25, 25))
    for a in range(20):
    
        w_confirm = world_data.at[a, 'confirm']
        w_heal = world_data.at[a, 'heal']
        w_dead = world_data.at[a, 'dead']
        ax1 = fig1.add_subplot(20 / 4,
                               4,
                               a + 1,
                               aspect='equal',
                               facecolor='#fafaf0')
        ax1.set_xlim(-w_confirm / 2, w_confirm / 2)
        ax1.set_ylim(-w_confirm / 2, w_confirm / 2)
    
        ax1.spines['top'].set_color('none')
        ax1.spines['right'].set_color('none')
        ax1.spines['bottom'].set_position(('data', 0))
        ax1.spines['left'].set_position(('data', 0))
        ax1.set_xticks([])
        ax1.set_yticks([])
        p0 = patches.Rectangle((-w_confirm / 2, -w_confirm / 2),
                               width=w_confirm,
                               height=w_confirm,
                               alpha=w_confirm / 90000,
                               facecolor='#29648c',
                               label='confirm')
        p1 = patches.Rectangle((-w_heal / 2, -w_heal / 2),
                               width=w_heal,
                               height=w_heal,
                               alpha=1,
                               facecolor='#69c864',
                               label='heal')
        p2 = patches.Rectangle((-w_dead / 2, -w_dead / 2),
                               width=w_dead,
                               height=w_dead,
                               alpha=1,
                               facecolor='black',
                               label='dead')
        plt.gca().add_patch(p0)
        plt.gca().add_patch(p1)
        plt.gca().add_patch(p2)
    
    
        plt.title(world_data.at[a, 'country'], fontdict={'size': 20})
    
    
        plt.legend(loc='best')
    
    plt.show()
    

    在这里插入图片描述
    这样就可以清楚的看到各个国家新冠确诊人数、治愈和死亡人数的关系了

    推荐阅读

    1. 冰冰B站视频弹幕爬取原理解析
    2. Python建立时间序列ARIMA模型实战案例
    3. 使用xpath爬取数据
    4. jupyter notebook使用
    5. BeautifulSoup爬取豆瓣电影Top250
    6. 一篇文章带你掌握requests模块
    7. Python网络爬虫基础–BeautifulSoup

    参考链接

    1. 腾讯疫情动态
    2. Python 制作全国疫情地图
    3. 利用Python实现新冠疫情数据可视化
    4. 欢迎关注

    在这里插入图片描述

    到这里就结束了,如果对你有帮助,欢迎点赞关注评论,你的点赞对我很重要。

    在这里插入图片描述

    展开全文
  • 展示了常见机器学习模型的可视化展示效果,使用的平台为Dataiku以及Netron工具 XGBoost 变量重要性可视化 决策树 图形可视化 逻辑回归 回归系数可视化 神经网络 网络结构 随机森林 图形可视化 梯度提升树 图形可视化
  • 最近使用darknet框架来进行目标检测模型的训练实践比较多,就想对模型的结构进行可视化,之前因为模型的训练都是基于Keras进行的,搭配graphviz就可以很方便地进行模型结构可视化展示了,现在使用darknet训练的话...

            最近使用darknet框架来进行目标检测模型的训练实践比较多,就想对模型的结构进行可视化,之前因为模型的训练都是基于Keras进行的,搭配graphviz就可以很方便地进行模型结构的可视化展示了,现在使用darknet训练的话,模型的结构定义都是存在cfg文件中的,想要进行可视化之前的代码就没办法直接使用了,在网上发现了一个有趣的项目就是基于cfg文件直接实现了模型结构的可视化展示,项目地址在这里

          截图如下:

           可以看到,使用方法也是很简单的,所以决定实践一波。

           我用的主要是YOLO系列的模型,这里对其进行可视化展示。代码很简单,都是通用的,如下所示:

    path_cfg='*.cfg'
    format_output_figure='png'
    savefilename=path_cfg.split('.cfg')[0]
    grap_g=plot_graph(path_cfg,savefilename, format=format_output_figure)
    grap_g.view()

            下面看一下一些经典的网络结构:

    yolov1:

    yolov2:
     

    yolov2-tiny:
     

    yolov3:

    yolov3-tiny:
     

    yolov3_5l:

    yolov3-spp:

    yolov3-tiny_xnor:

    yolov4:

    yolov4-tiny:
     

    yolobile:

    MobileNetV2Lite:

    MobileNetV2Nano-voc:

           就画到这里了,感兴趣的可以试试哈!

    展开全文
  • 数据的地图可视化展示 虽然Zeppelin针对结构化数据默认提供了表格、直方图、饼图、区域图、折线图和散点图共6种可视化方式,但我们通过Zeppelin提供的helium插件功能可以集成更多可视化形式,helium通过npm方式安装...

    数据的地图可视化展示

    虽然Zeppelin针对结构化数据默认提供了表格、直方图、饼图、区域图、折线图和散点图共6种可视化方式,但我们通过Zeppelin提供的helium插件功能可以集成更多可视化形式,helium通过npm方式安装插件,此功能必须要连接互联网,系统会从接口获取所有可用的插件。
    常用的可视化插件

    基于highcharts的可视化插件
    ultimate-heatmap-chart 热力图
    ultimate-scatter-chart 加强散点图
    zeppelin-highmaps 地图

    基于leaflet框架
    zeppelin-leaflet 地图

    leaflet是轻量级的二维地图框架,具有文件体积小、反应快等特点,是目前地图应用中使用广泛的地图框架。zeppelin-leaflet插件基于leaflet插件实现,可以将结构化数据以地图方式可视化展示。zeppelin-leaflet插件可视化的结构化数据中必须包含经纬度数据。

    进入helium配置页面,找到zeppelin-leaflet插件,点击enable按钮,开启地图可视化功能。
    在这里插入图片描述

    注意:一般情况下,helium是热加载的,不用重启Zeppelin刷新页面就可以看到地图可视化选项,如果不起作用,需要重启Zeppelin。

    应用实例

    基于elasticsearch解释器,创建一条包含城市、经纬度和事件等字段的数据记录,并通过查询语句将其可视化展示。

    • 创建文档
      在这里插入图片描述
    • 数据可视化

    点击地图可视化的小按钮,设置lat(纬度)、lng(经度)、tooltip(悬浮提示)、popup(鼠标按下时提示)选项。
    在这里插入图片描述

    参考资料

    可视化交互式数据分析工具Apache Zeppelin
    Apache Zeppelin安装部署
    Windows安装部署Apache Zeppelin
    Apache Zeppelin快速入门
    Apache Zeppelin主要界面和基本操作
    Zeppelin组件配置和使用:使用JDBC连接Mysql
    Zeppelin组件配置和使用:连接Elasticsearch
    Apache Zeppelin源码结构分析

    展开全文
  • 爬取网易云数据并且可视化展示

    千次阅读 多人点赞 2021-04-14 18:32:32
    结构化爬取网易云数据并且可视化展示项目说明代码框架第三方库说明内容爬取说明完整代码爬取结果内容可视化 项目说明 网易云音乐歌单数据获取,获取某一歌曲风格的所有歌单,进入每个歌单获取歌单名称、创建者、播放...

    项目说明

    网易云音乐歌单数据获取,获取某一歌曲风格的所有歌单,进入每个歌单获取歌单名称、创建者、播放量、页面链接、收藏数、转发数、评论数、标签、介绍、收录歌曲数、部分收录歌名,并统计播放量前十的歌单,将播放量前十的歌单以及对应的所有信息进行另外存储,对其进行可视化展示。
    在做这个爬虫的时候,对于如何翻页问题和身边的人进行了探讨,有人说用selenium模拟点击,但是通过观察网页,我发现即使是不用模拟点击翻页也能历遍爬完歌单的信息,接下来我就带着大家一起如何爬取数据。

    代码框架

    在这里插入图片描述

    第三方库说明

    在项目中用到的一些第三方库的介绍:

    #      bs4
    '''
    BS4全称是Beautiful Soup,它提供一些简单的、
    python式的函数用来处理导航、搜索、修改分析树等功能。
    它是一个工具箱,通过解析文档为Beautiful Soup自动将输入文档转换为
    Unicode编码,输出文档转换为utf-8编码。
    '''
    
    #     requests
    '''
    用requests库来访问网页,获取网页内容,支持HTTP特性
    '''
    
    #     time
    '''
    Time库是与时间处理有关的模块,
    在这个项目中是用来强制网页访问间隔时间的。
    '''
    
    #     random
    '''
    Random库主要功能是提供随机数,在项目中和time库配合使用,
    生产随机强制访问的间隔时间的
    '''
    
    #     xlwt
    '''
    Python访问Excel时的库,其功能是写入xls文件,
    在本项目中是用于写入爬取的数据
    '''
    
    #      pandas  
    '''
    Pandas库是基于NumPy的一种工具,用于读取文本文件的,
    可以快速便捷的处理数据的库。
    '''
    
    #     pyecharts.charts
    '''
    pyecharts.charts是用于数据可视化的库,其中包含很多种画图工具,
    在本项目中应用到的是画柱状图是Bar,圆饼图是Pie
    '''
    
    #    matplotlib.pyplot
    '''
    matplotlib也是可视化的库,由各种可视化的类构成,
    matplotlib.pyplot是绘制各类可视化图形的命令子库
    '''
    

    内容爬取说明

    爬取链接:https://music.163.com/discover/playlist/?cat=

    页面详情

    观察网页内容是我们进行爬虫项目的首要步骤,这里我选择了华语类型的歌单来观察一下;
    在这里插入图片描述
    在这里插入图片描述
    华语风格的歌单总共有37页,每页有35个歌单,那总共大约有1295个歌单。一个风格的歌单是代表不了全部的,我们在做爬虫的时候要避免以偏概全,多看一个页面,找出规律,这样才能写出结构化的爬虫,当网页的内容发生变化,但总体框架没有变化时,我们的代码就能继续运行,这也是考验代码健壮性的一方面(跑偏了)。
    在选择其他歌单类别后,可以看到每个类别的歌单基本都是用37或38个页面来存放歌单,每个页面有35个歌单,那如何历遍每一个页面呢?
    我当时面对这个问题的时候也是想了很久,又不想用selenium模拟点击,那我们就要多观察源代码,看看有没有蛛丝马迹。

    老规矩 F12 进入开发者选项:

    在这里插入图片描述
    在这里插入图片描述
    在源代码中,我们可以看到每个页面对应的链接是有规律的,

    例如:“https://music.163.com/#/discover/playlist/?order=hot&cat=%E5%8D%8E%E8%AF%AD&limit=35&offset=35”

    通过网页链接观察,我发现对于网页翻页的重点在于“&limit=35&offset=35”的数字35,每个页面是以链接后面的数字决定当前是在第几个页面,是以0为首页面,35为倍数的规律,第一个页面为 “&limit=0&offset=0”, 第二个页面为 “&limit=35&offset=35”,第三个页面为 “&limit=35&offset=70”,以此类推,只要知道当前类别的歌单有多少个页面,就可以通过for循环来循环翻页,遍历每一个页面。

    既然我们已经知道了翻页的规律了,那现在的重点就是获取歌单的页数。我们可以在箭头指引的地方,用开发者选项自带的复制方式,直接右键选择copy,copy selector直接复制CSS选择器语句;

    标签: #m-pl-pager > div > a:nth-child(11)
    
    #获取歌单网页的页数
    result = bs.select('#m-pl-pager > div > a:nth-child(11)') 
    
    

    那接下来就是对单个歌单进行内容爬取了,由于我们爬取的内容较多,所以这里就不一一列举了,大家可以自行对比参照,不懂可以私信。

    获取歌单名称
    在这里插入图片描述
    进入每一个页面,获取该页面的每一个歌单,进入单个歌单中,歌单名称,创建者,播放量等数据都存放在网页的同一个div内,

    id='content-operation'
    

    通过selector选择器选择各个内容的,由于是在网易云的网页版,因此在歌单内的歌曲并没有显示所有歌曲,只显示了10条歌曲,因此在爬取的时候每个歌单只获取了10条歌曲。如果还想要爬取每天歌曲更多详细内容,可以进入歌曲的url链接,获取更多的内容

    完整代码

    这里我会定义一个内容类Content 和 网页信息类Website,进行结构化爬虫,如果不是很理解的话,可以看看我之前发过的内容,

    爬取三联生活周刊新闻

    Content类和 Website类

    class Content:
        def __init__(self, url, name, creator, play, collect, transmit, comment, tag,
                    introduce, sing_num, sing_name):
            self.url = url
            self.name = name
            self.creator = creator
            self.play = play
            self.collect = collect
            self.transmit = transmit
            self.comment = comment
            self.tag = tag
            self.introduce = introduce
            self.sing_num = sing_num
            self.sing_name = sing_name
            
        def print(self):
            print("URL: {}".format(self.url))
            print("NAME:{}".format(self.name))
            print("CRAETOR:{}".format(self.creator))
            print("PLAY:{}".format(self.play))
            print("COLLECT:{}".format(self.collect))
            print("TRANSMIT:{}".format(self.transmit))
            print("COMMENT:{}".format(self.comment))
            print("TAG:{}".format(self.tag))
            print("INTRODUCE:{}".format(self.introduce))
            print("SING_NUM:{}".format(self.sing_num))
            print("SING_NAME:{}".format(self.sing_name))
            
    class Website:
        def __init__(self, searchUrl, resultUrl,  pUrl, absoluterUrl, nameT, creatorT, playT, collectT, transmitT, 
                     commentT, tagT, introduceT, sing_numT, sing_nameT):
            self.resultUrl = resultUrl
            self.searchUrl = searchUrl
            self.absoluterUrl = absoluterUrl
            self.pUrl = pUrl
            self.nameT = nameT
            self.creatorT = creatorT
            self.playT = playT
            self.collectT = collectT
            self.transmitT = transmitT
            self.commentT = commentT
            self.tagT = tagT
            self.introduceT = introduceT
            self.sing_numT = sing_numT
            self.sing_nameT = sing_nameT
    

    爬取类 Crawler

    from bs4 import BeautifulSoup
    import re
    import requests
    import time
    import random
    import xlwt  #进行excel操作
    
    class Crawler:
        
        #爬取网页函数
        def getWeb(self, url):  
            try:  #异常处理
            	#请求头
                headers_ = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
                        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}
                req = requests.get(url, headers = headers_)
                req.encoding = "utf-8"  #网页格式化,避免出现乱码
            except requests.exceptions.RequestException:
                return None
            
            return BeautifulSoup(req.text, "html.parser")
         
         #爬取所需内容的函数   
        def getContent(self, pageObj, selector):
            childObj = pageObj.select(selector)
           
    #         print("\n".join(line.text for line in childObj))
            return "\n".join(line.text for line in childObj)
    
        #搜索函数,主函数    
        def search(self, topic, site):
        
    #         爬取某种风格的歌单有多少页
            newurl = site.searchUrl + topic
            newurl = requests.utils.quote(newurl, safe=':/?=&')  #对url链接上存在的中文字符进行处理
            bs = self.getWeb(newurl)
            result = bs.select('#m-pl-pager > div > a:nth-child(11)')  
            num = int("\n".join(link.text for link in result))  #某种风格歌单的页数
            
    #         翻页,选取一种歌曲风格,有多个页面加载歌单,分别读取
            for i in range(0, num+1):
                j = 35*i
                url = site.searchUrl + topic + '&limit=35&offset=' + str(j)  #构造每个页面的url链接
                url = requests.utils.quote(url, safe=':/?=&')
                bs = self.getWeb(url)
                
                searchResults = bs.select(site.resultUrl)
    
                for link in searchResults:
    
                    url = link.attrs["href"]
    
                    #         判断是否为绝对链接
                    if(site.absoluterUrl):
                        bs = self.getWeb(url)
                    else:
                        bs = self.getWeb(site.pUrl + url)
        #                 print(site.pUrl + url)
                    if(bs is None):
                        print("something was wrong with that page or URL. Skipping")
                        return
                    else:
                                            
                    #爬取歌曲名称 
                        main = bs.find('ul',{'class':'f-hide'})
                        sing_name = "\n".join(music.text for music in main.find_all('a'))
                            
    
        #             爬取相关内容
                    data = []  #申请一个数组,以歌单为单位,存储每个歌单里面所需要的内容
    
                    url = site.pUrl + url
                    data.append(url)
        #             print(data)
    #     加入一个参数,判断目前读取的数据是字符串还是整数
                    name = self.getContent(bs, site.nameT)
                    data.append(name)
                    creator = self.getContent(bs, site.creatorT)
                    data.append(creator)
                    play = self.getContent(bs, site.playT)
                    data.append(play)
                    collect = self.getContent(bs, site.collectT)
                    data.append(collect)
                    transmit = self.getContent(bs, site.transmitT)
                    data.append(transmit)
                    comment = self.getContent(bs, site.commentT)
                    data.append(comment)
                    tag = self.getContent(bs, site.tagT)
                    data.append(tag)
                    introduce = self.getContent(bs, site.introduceT)
                    data.append(introduce)
                    sing_num = self.getContent(bs, site.sing_numT)
                    data.append(sing_num)
    #                 sing_name = self.getContent(bs, site.sing_nameT)
                    data.append(sing_name)
    
                    datalist.append(data)  #以歌单为单位存入数组中
        #             print(datalist)
                    content = Content(url, name, creator, play, collect, transmit, comment, tag, introduce, sing_num, sing_name)
        #             content.print()
        #             return datalist
        
        #数据写入文档        
        def saveData(self, datalist, savepath):
            print("保存到Excel文件中!")
    #         xlwt.Workbook用来创建一个工作表,style_compression=0表示是否被压缩
            music = xlwt.Workbook(encoding = 'utf-8', style_compression=0)
    #     添加sheet表格,并允许重复修改
            sheet = music.add_sheet('网易云音乐数据爬取', cell_overwrite_ok=True)
    #         定义列名
            col = ("url", "歌单名称", "创建者", "播放量", "收藏量", "转发量", 
                   "评论量", "标签", "介绍", "歌曲数量", "歌曲名称" )
            for i in range(0,11):
                sheet.write(0, i, col[i])  #将列名写进表格
            for i in range(0, len(datalist)-1):
    #             print("第{}行正在写入".format(i+1))
                data = datalist[i]
                for j in range(0, 11):
                    sheet.write(i+1, j, data[j])
                   
            music.save('E:/新建文件夹/Python爬虫/网易云音乐.xls')
            print("数据保存成功!")
    
    
    
    crawler = Crawler()
    # searchUrl, resultUrl,  pUrl, absoluterUrl, nameT, creatorT, playT, collectT, transmitT, 
    #                  commentT, tagT, introduceT, sing_numT, sing_nameT
    #对应website类的参数,将website定义的参数进行实例化
    siteData = [['https://music.163.com/discover/playlist/?cat=', 'a.msk',
                 'https://music.163.com', False, 'div.tit h2.f-ff2.f-brk', 'span.name a',
                'strong#play-count', 'a.u-btni.u-btni-fav i', 'a.u-btni.u-btni-share i',
                 '#cnt_comment_count', 'div.tags.f-cb a i', 'p#album-desc-more',
                'div.u-title.u-title-1.f-cb span.sub.s-fc3', 'span.txt a b']]
    sites = []
    datalist = []
    for row in siteData:
        sites.append(Website(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13]))
    topics = "华语"  #选择自己想要的歌曲风格
    time.sleep(random.random()*3)
    for targetSite in sites:
        crawler.search(topics, targetSite)
    savepath = '网易云音乐.xls'
    crawler.saveData(datalist, savepath)
    

    爬取结果

    爬取的结果
    在这里插入图片描述
    由于数据太多了,这里就只截取了一部分,有兴趣可以自己运行一下;

    内容可视化

    可视化代码

    import pandas as pd
    from pyecharts.charts import Pie  #画饼图
    from pyecharts.charts import Bar  #画柱形图
    from pyecharts import options as opts
    import matplotlib.pyplot as plt
    
    
    # 读入数据,需要更改
    #可视化
    data = pd.read_excel('网易云音乐.xls')
    #根据播放量排序,只取前十个
    df = data.sort_values('播放量',ascending=False).head(10)
    v = df['歌单名称'].values.tolist()   #tolist()将数据转换为列表形式
    d = df['播放量'].values.tolist()
    #设置颜色
    color_series = ['#2C6BA0','#2B55A1','#2D3D8E','#44388E','#6A368B'
                    '#7D3990','#A63F98','#C31C88','#D52178','#D5225B']
    # 实例化Pie类
    pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))
    # 设置颜色
    pie1.set_colors(color_series)
    # 添加数据,设置饼图的半径,是否展示成南丁格尔图
    pie1.add("", [list(z) for z in zip(v, d)],
            radius=["30%", "135%"],
            center=["50%", "65%"],
            rosetype="area"
            )
    # 设置全局配置项
    # TitleOpts标题配置项 
    # LegendOpts图例配置项  is_show是否显示图例组件
    # ToolboxOpts()工具箱配置项 默认项为显示工具栏组件
    
    pie1.set_global_opts(title_opts=opts.TitleOpts(title='播放量top10歌单'),
                         legend_opts=opts.LegendOpts(is_show=False),
                         toolbox_opts=opts.ToolboxOpts())
    # 设置系列配置项
    # LabelOpts标签配置项  is_show是否显示标签;  font_size字体大小;
    # position="inside"标签的位置,文字显示在图标里面; font_style文字风格
    # font_family文字的字体系列
    pie1.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="inside", font_size=12,
                                                   formatter="{b}:{c}播放量", font_style="italic",
                                                   font_weight="bold", font_family="Microsoft YaHei"
                                                   ),
                         )
    # 生成html文档
    pie1.render("E:/玫瑰图.html")
    print("玫瑰图保存成功!")
    
    print("-----"*15)
    # print(df['创建者'].values.tolist())
    bar = (
        Bar()
        .add_xaxis([i for i in df['创建者'].values.tolist()])
        .add_yaxis('播放量排名前十对应的评论量', df['评论量'].values.tolist())
    )
    bar.render("E:/条形图.html")
    print("柱形图保存成功!")
    
    

    词云代码

    import wordcloud
    import pandas as pd
    import numpy as np
    
    data = pd.read_excel('网易云音乐.xls')
    #根据播放量排序,只取前十个
    data = data.sort_values('播放量',ascending=False).head(10)
    print(data["歌单名称"])
    #font_path指明用什么样的字体风格,这里用的是电脑上都有的微软雅黑
    w1 = wordcloud.WordCloud(width=1000,height=700,
                             background_color='white',
                             font_path='msyh.ttc')
    txt = "\n".join(i for i in data['歌单名称'])
    w1.generate(txt)
    w1.to_file('E:\\词云.png')`
    

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

    柱形图
    在这里插入图片描述
    词云
    在这里插入图片描述

    结束,有兴趣的朋友可以来交流一下,这期的内容就到这了,大家晚安,拜拜!

    展开全文
  • 深度学习之网络结构可视化

    千次阅读 2020-05-18 22:49:51
    1、网络结构可视化 2、训练过程可视化 tensorflow:tensorboard pytorch:tensorboardX,visdom
  • Caffe 网络结构可视化

    万次阅读 2016-09-19 14:57:46
    可以利用python接口实现网络结构可视化,便于直观理解。注:主要参考《21天实战caffe》1.准备Python环境1.1安装Pythonsudo apt-get update sudo apt-get install python-dev1.2安装Python包管理器:pip 这里建议...
  • 可视化的数据结构和算法: http://coolshell.cn/articles/4671.html 寻路算法可视化: http://qiao.github.io/PathFinding.js/visual/ 正则表达式可视化工具 http://refiddle.com/ ...
  • 知识图谱可视化展示

    万次阅读 2018-07-27 23:48:52
    知识图谱是将复杂的信息...本文将利用思知知识图谱API接口对知识图谱进行可视化展示。(API请求说明见:https://www.ownthink.com/)   环境准备 Python3安装requests库:pip3 install requests 数据获取方...
  • 严蔚敏数据结构可视化演示系统,可以用来演示数据结构的算法执行流程,帮助大家更好地理解。
  • Django使用echarts进行可视化展示(mysql数据库)

    千次阅读 热门讨论 2020-07-21 23:21:49
    Django使用echarts进行可视化展示(mysql数据库)条件准备连接mysql导入数据使用echarts可视化展示 本文以学生成绩折线图展示为例 条件准备 电脑上有myslq数据库 有 echarts 的 js 文件 连接mysql # settings.py...
  • 总共两部分,此为第一部分,java可视化编译工具,可以查看各个函数的结构流程图,尤其对大型项目是个梳理思路流程的好东西
  • 基于复杂网络社区划分的网络拓扑结构可视化布局算法
  • Netscope是个支持prototxt格式描述的神经网络...它可以用来可视化Caffe结构里prototxt格式的网络结构 使用起来也非常简单,打开这个地址:http://ethereon.github.io/netscope/#/editor 把你的描述神经网络结构的pr...
  • 本体库可视化展示

    千次阅读 2014-09-23 10:08:48
    本体库可视化展示   转载▼  历时一个多月的时间,终于把项目本体库可视化的核心模块写好了。作为阶段的成果,现将其整理总结。(注:该项目是和XXXX的合作项目,按照二十四史来建立人物、时间...
  • 前段时间,发现了一个可视化模型...目前的Netron支持主流各种框架的模型结构可视化工作,我直接给出gayhub链接: https://github.com/lutzroeder/Netron 支持windows,Linux,mac系统 转载自链接:https://blog.cs...
  • 数据结构可视化

    千次阅读 2017-04-30 12:16:51
    Galles做的各种可视化的数据结构和基本算法的主页:http://www.cs.usfca.edu/~galles/visualization/Algorithms.html 基础 Stack栈: 数组实现Stack栈: 链表实现Queues队列: 数组实现Queues队列: 链表实现Lists...
  • 利用python是可以实现卷积网络结构的可视化的,但是window平台下使用相当麻烦,这里...http://ethereon.github.io/netscope/#/editor进来后,把协议文件复制过来,然后shift+enter,就可以把网络节结构可视化出来了,方
  • 深度学习 网络结构 可视化

    千次阅读 2016-06-15 10:47:15
    今天发现一个 可以可视化深度学习 网络结构的 在线工具,  http://ethereon.github.io/netscope/#/editor 输入是 caffe 的deploy.prototxt 。 1 粘进去 2 按 Shitf+Enter 就开始画图了,速度很快。
  • caffe中网络结构可视化

    千次阅读 2017-10-10 09:47:18
    可视化方法很多,一种是用caffe自带的draw_net.py 来实现网络结构可视化。具体实现如下>> python /caffe/python/draw_net.py train.prototxt net.png 用python命令执行draw_net.py  实现train.prototxt 的网络...
  • 有一个.tflite的深度学习模型框架文件需要可视化展示,网上搜到一个好用的可视化工具Netron,分享一下。 在线直接打开:https://netron.app/ github地址:https://github.com/lutzroeder/netron Netron的介绍 ...
  • 前一篇文章讲述了数据预处理、Jieba分词和文本聚类知识,这篇文章主要介绍Matplotlib和Pandas扩展包绘图的基础用法,同时引入Echarts技术,该技术主要应用于网站可视化展示中。本文内容以实例为主,给读者最直观的...
  • SciPy.org — SciPy.org https://www.scipy.org,网站Documentation——pandas——searchimport numpy as np import pandas as pd import matplotlib as mpl from matplotlib import pyplot as plt————————...
  • 基于js+echarts实现数据可视化大屏展示

    万次阅读 多人点赞 2019-12-27 17:53:57
    vue+echarts大屏数据可视化展示参见点击进入 需求原因,做了一套数据可视化页面的展示效果demo。主要使用了echarts里面的纵向和横向柱状图,区域地图,以及环状图和折线图。基本满足部分场景的需求。下面看效果...
  • 为了精细刻画采场水文地质结构和跟踪充水要素的动态变化信息,提高矿井水害监测预警技术水平,笔者提出了三维充水结构可视化概念。三维充水结构由静态模型和动态可视化模型组成,静态模型是实体模型,动态可视化模型...
  • explain-git-with-d3 使用 D3 对 git 的分支操作进行简单的可视化展示。 标签:explain
  • 利用python爬取新冠肺炎疫情实时数据+可视化展示

    万次阅读 多人点赞 2020-02-15 12:41:53
    #返回数据字典 data = json.loads(reponse['data']) return data data = catch_data() data.keys() lastUpdateTime = data['lastUpdateTime'] # 数据明细,数据结构比较复杂,一步一步打印出来看,先明白数据结构 ...
  • 该工具专为 TUM 的主题“基础知识:算法和数据结构”而设计。 目的是提供一个涵盖整个材料范围的视觉测试和学习环境。 该项目是在 2012 年学期休假期间开始的,并在几周内升级到当前的...主要是由于逐步可视化的局限性
  • 尽管如此,在大数据时代依然有很多数据存储在非常见数据源中,这些数据无法直接对接Grafana进行可视化展示,但是我们又对Grafana的性能以及制作的酷炫图表爱不释手,JSON数据源插件的出现很大程度上缓解了这个窘境。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,204
精华内容 30,081
关键字:

结构可视化展示