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

下面,我们开始吧!

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

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

首先,准备好相关库

requests、pandas、BeautifulSoup、matplotlib等

因为这是第三方库,所以我们需要额外下载

下载有两种方法(以requests为例,其余库的安装方法类似):

(一)在命令行输入

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

pip install requests

(二)通过PyCharm下载

第一步:编译器左上角File–>Settings…

第二步:找到Project Interpreter 点击右上角加号按钮,弹出界面上方搜索库名:requests,点击左下角Install ,当提示successfully时,即安装完成。

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

一、获取网页内容

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

爬取结果如下图所示:

成功!

二、信息解析阶段:

第一步,先构建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,就能看到网页代码,找到相应位置,就能清晰地看见相关信息:

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

# ********************************************  播放量存储

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

我们可以打开文件看一看存储的信息格式(双击打开)

成功!

三、数据可视化分析

我们先做一些基础设置

要先准备一个文件: STHeiti Medium.ttc [注意存放在项目中的位置]

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

我们来看看最终效果

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

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

以上就是关于爬虫以及数据可视化分析的内容,希望能帮到你们!

源码点击蓝色字体:后记

近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地

喜欢记得点个赞哦~

python爬虫可视化excel_Python爬虫以及数据可视化分析!相关推荐

  1. 【大数据分析专业毕设之基于python爬虫的电影票房大数据预测分析+大屏可视化分析

    [大数据分析专业毕设之基于python爬虫的电影票房大数据预测分析+大屏可视化分析-哔哩哔哩https://b23.tv/saIKtBH flask web框架,数据使用requests模块爬取数据, ...

  2. 【【数据可视化毕业设计:差旅数据可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩】-哔哩哔哩】 https://b23.tv/iTt30QG

    [[数据可视化毕业设计:差旅数据可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩]-哔哩哔哩] https://b23.tv/iTt30QG ht ...

  3. Python: 除matplotlib外还有哪些数据可视化库?

    Python: 除matplotlib外还有哪些数据可视化库? matplotlib算是python比较底层的可视化库,可定制性强.图表资源丰富.简单易用.达到出版质量级别. 其它的可视化库诸如: s ...

  4. Python基于WordCloud词云图的数据可视化分析 词云图的基本使用 政府工作报告分析

    Python基于WordCloud词云图的数据可视化分析 词云图的基本使用 政府工作报告分析 文章目录 1.词云图简介 2.wordcloud库的安装 3.WordCloud的主要参数说明 4.绘制词 ...

  5. python使用pyecharts库画地图数据可视化

    python使用pyecharts库画地图数据可视化 导库 中国地图 代码 结果 世界地图 代码 结果 省级地图 代码 结果 地级市地图 代码 结果 导库 from pyecharts import ...

  6. 用python进行简单的数据分析和数据可视化

    用python进行简单的数据分析和数据可视化 本篇文章主要是初步探索数据分析,简单了解数据分析大致流程 数据来源:来自于Kaggle平台上的一个项目:Explore San Francisco cit ...

  7. 在R、Python和Julia中常用的数据可视化技术

    俗话说"一图胜千言".通过各种图片和图形化展示,我们可以更清晰地表达很多抽象概念.理论.数据模式或某些想法.在本章中,我们首先解释为什么应该关心数据可视化.然后,我们将讨论几种在R ...

  8. python模拟投掷色子并做出数据可视化统计图

    这里讲解模拟掷色子,并实现数据可视化的操作. 数据可视化可以帮助我们更好地分析相关的统计结果,获得更为直观的统计图,帮组我们更好的处理一些事情. 可视化的终极目标是洞悉蕴含在数据中的现象和规律,这里面 ...

  9. python数据可视化书籍推荐_数据可视化的优秀入门书籍有哪些?

    数据可视化方向 首先你需要考虑清楚"非常感兴趣的数据可视化"属于哪一类? 数据可视化是个非常宽泛的领域,大体可以分为"信息图Infographic"和" ...

  10. Python+vtk 实现激光点云数据可视化学习(2021.7.12)

    Python+VTK实现激光点云数据可视化学习 2021.7.12 1.激光点云与VTK简介 2.配置Python环境(Conda+PyCharm+Python3.6+VTK) 3.点云数据(大约60 ...

最新文章

  1. es6数组去重_JavaScript数组去重
  2. golang使用reflects调用方法时,方法名需要首字母大写
  3. WinCE开机默认语言设置 .
  4. 四级计算机网络选择题,2015全国计算机等级考试四级计算机网络模拟选择题
  5. 01.elasticsearch metric aggregation 查询
  6. finally语句与return语句的执行顺序
  7. 京东末位淘汰 10% 高管:稳定不是常态,淘汰才是
  8. 简述中断处理的6个步骤_计算机组成原理期末考试简答题重点分解
  9. 实验二+018+李滨
  10. 程序员面试金典——4.3高度最小的BST
  11. java day43【Filter:过滤器 、Listener:监听器】
  12. TensorFlow学习笔记——自然语言处理
  13. 如何在自己的板子上实现android关机
  14. 图像相似度比较之哈希算法
  15. python 返回上一级_命令行 返回上一级目录怎么操作
  16. 电商平台商品详情API调用,获取SKU各类信息
  17. 神经网络辨识的优势是,神经网络辨识的优势有
  18. 微信小程序图片在不同设备显示保持图片比例并且居中
  19. 【汇正财经】大盘低开回升
  20. 慢慢读《Deep Learning In Natural Language Processing》(一)

热门文章

  1. Mysql数据库知识点归纳汇总
  2. 青春期玩游戏不想上学怎么办?
  3. dubbo空指针异常
  4. 18日精读掌握《费曼物理学讲义-卷一》计划(2019/6/12-2019/6/29)
  5. latex 波浪线 ~
  6. NB模组RSRP按比例转换为CSQ范围信号
  7. 爬虫实战2(上):爬取豆瓣影评
  8. 数组排序:声明一个整型数组并填充数据,排序,输出排序后数据,倒序输出数据。
  9. 信息编码 — 进大厂必备底层能力之一(文末有彩蛋)
  10. python生成二维码教程_使用Python生成个性二维码