Python爬虫以及数据可视化分析「建议收藏」

Python爬虫以及数据可视化分析「建议收藏」Python爬虫以及数据可视化分析之B站动漫排行榜信息爬取分析简书地址:https://www.jianshu.com/u/40ac87350697简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析源码文件可以参考Github上传的项目:https://github.com/Lemon-Sheep/Py/tree/master下面,我们开始吧!PS:作为Python爬虫初学者,如有不正确的地方,望各路大神不吝赐教[抱拳]本项目将会对B站番剧排行的数据进行网页信息爬取以及

大家好,又见面了,我是你们的朋友全栈君。

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()

来看看效果
Python爬虫以及数据可视化分析「建议收藏」
有没有瞬间就感觉高~大~上~~了(嘿嘿~)

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

# **********************************************************************评论数和收藏数对比
    # ********评论数条形图
    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

喜欢记得点个赞哦~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149368.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 在win2003上IIS部署可能出现的问题的解决方案

    在win2003上IIS部署可能出现的问题的解决方案

    2021年8月22日
    52
  • C语言魔塔游戏[通俗易懂]

    C语言魔塔游戏[通俗易懂]很早就很想写这个,今天终于写完了。游戏截图:编译环境:VS2017下面我来介绍一下游戏的主要功能和实现方式首先是玩家的定义,使用结构体,这个名字是可以自己改变的structgamerole{ charn…

    2022年5月20日
    38
  • vim常用快捷键

    vim常用快捷键键盘移动(Move)一切都从键盘的移动k ->上upj ->下downh ->左leftl ->右rightz ->重画屏幕,当前光标变成屏幕的第一行(redrawcurrentlineattopofwindow)CTRL-f ->跳到下一页(pagedown)CTRL-b ->跳到上一页(pageup)跳跃

    2022年5月13日
    70
  • mysql清空表数据_mysql数据库之如何清空表中数据「建议收藏」

    mysql清空表数据_mysql数据库之如何清空表中数据「建议收藏」本篇文章主要讲述的是在数据库中使用清空命令,具有一定学习价值,有需要的朋友可以了解一下,希望能够对你有所帮助。在做数据迁移,数据清洗或者写web项目时要将数据替换更新,那么有时要将表做清空处理常用的清空数据表的SQL语句有如下两种deletefrom表名;truncatetable表名;运行测试我使用的是MySql待测试的表有20000条记录,将其多拷两份以备测试分别运行两个清空表的SQL…

    2022年6月11日
    47
  • vscode常用插件大全「建议收藏」

    vscode常用插件大全「建议收藏」vscode常用插件大全参考文章https://mp.weixin.qq.com/s/1PkWPApvn5uWJl_cdzcoTA说明该片文章基本介绍了vscode常用插件,已经很全面本文不做任何编辑器的比较,只是我本人日常使用vscode进行开发,并且比较喜欢折腾vscode,会到处找这一些好玩的插件,于是越攒越多,今天给大家推荐一下我收藏的60多个vscode插件,据说插件装太多,编辑器会变卡,可能是我的电脑配置还顶得住,目前并没有感觉到卡卡的。接下来我会将会

    2022年9月30日
    9
  • python 如何安装numpy库?

    python 如何安装numpy库?我正在参与CSDN200进20,希望得到您的支持,扫码续投票5次。感谢您!(为表示感谢,您投票后私信我,我把我总结的人工智能手推笔记和思维导图发送给您,感谢!)首先我们要找到python安装的位置win+R打开进入以后输入:wherepython找到安装目录后,找到Scripts文件夹所在位置:如Programs\Python\Python36\Scripts…

    2022年9月28日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号