python爬虫可视化excel_Python爬虫以及数据可视化分析!
简单几步,通过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爬虫以及数据可视化分析!相关推荐
- 【大数据分析专业毕设之基于python爬虫的电影票房大数据预测分析+大屏可视化分析
[大数据分析专业毕设之基于python爬虫的电影票房大数据预测分析+大屏可视化分析-哔哩哔哩https://b23.tv/saIKtBH flask web框架,数据使用requests模块爬取数据, ...
- 【【数据可视化毕业设计:差旅数据可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩】-哔哩哔哩】 https://b23.tv/iTt30QG
[[数据可视化毕业设计:差旅数据可视化分析,python爬虫可视化/数据分析/大数据/大数据屏/数据挖掘/数据爬取,程序开发-哔哩哔哩]-哔哩哔哩] https://b23.tv/iTt30QG ht ...
- Python: 除matplotlib外还有哪些数据可视化库?
Python: 除matplotlib外还有哪些数据可视化库? matplotlib算是python比较底层的可视化库,可定制性强.图表资源丰富.简单易用.达到出版质量级别. 其它的可视化库诸如: s ...
- Python基于WordCloud词云图的数据可视化分析 词云图的基本使用 政府工作报告分析
Python基于WordCloud词云图的数据可视化分析 词云图的基本使用 政府工作报告分析 文章目录 1.词云图简介 2.wordcloud库的安装 3.WordCloud的主要参数说明 4.绘制词 ...
- python使用pyecharts库画地图数据可视化
python使用pyecharts库画地图数据可视化 导库 中国地图 代码 结果 世界地图 代码 结果 省级地图 代码 结果 地级市地图 代码 结果 导库 from pyecharts import ...
- 用python进行简单的数据分析和数据可视化
用python进行简单的数据分析和数据可视化 本篇文章主要是初步探索数据分析,简单了解数据分析大致流程 数据来源:来自于Kaggle平台上的一个项目:Explore San Francisco cit ...
- 在R、Python和Julia中常用的数据可视化技术
俗话说"一图胜千言".通过各种图片和图形化展示,我们可以更清晰地表达很多抽象概念.理论.数据模式或某些想法.在本章中,我们首先解释为什么应该关心数据可视化.然后,我们将讨论几种在R ...
- python模拟投掷色子并做出数据可视化统计图
这里讲解模拟掷色子,并实现数据可视化的操作. 数据可视化可以帮助我们更好地分析相关的统计结果,获得更为直观的统计图,帮组我们更好的处理一些事情. 可视化的终极目标是洞悉蕴含在数据中的现象和规律,这里面 ...
- python数据可视化书籍推荐_数据可视化的优秀入门书籍有哪些?
数据可视化方向 首先你需要考虑清楚"非常感兴趣的数据可视化"属于哪一类? 数据可视化是个非常宽泛的领域,大体可以分为"信息图Infographic"和" ...
- Python+vtk 实现激光点云数据可视化学习(2021.7.12)
Python+VTK实现激光点云数据可视化学习 2021.7.12 1.激光点云与VTK简介 2.配置Python环境(Conda+PyCharm+Python3.6+VTK) 3.点云数据(大约60 ...
最新文章
- es6数组去重_JavaScript数组去重
- golang使用reflects调用方法时,方法名需要首字母大写
- WinCE开机默认语言设置 .
- 四级计算机网络选择题,2015全国计算机等级考试四级计算机网络模拟选择题
- 01.elasticsearch metric aggregation 查询
- finally语句与return语句的执行顺序
- 京东末位淘汰 10% 高管:稳定不是常态,淘汰才是
- 简述中断处理的6个步骤_计算机组成原理期末考试简答题重点分解
- 实验二+018+李滨
- 程序员面试金典——4.3高度最小的BST
- java day43【Filter:过滤器 、Listener:监听器】
- TensorFlow学习笔记——自然语言处理
- 如何在自己的板子上实现android关机
- 图像相似度比较之哈希算法
- python 返回上一级_命令行 返回上一级目录怎么操作
- 电商平台商品详情API调用,获取SKU各类信息
- 神经网络辨识的优势是,神经网络辨识的优势有
- 微信小程序图片在不同设备显示保持图片比例并且居中
- 【汇正财经】大盘低开回升
- 慢慢读《Deep Learning In Natural Language Processing》(一)