Python爬虫以及数据可视化分析

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.stringname.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 = numelse: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_siblingpl = 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
该文件我已上传至我的资源,需要的可直接下载:STHeiti Medium.tcc

my_font = font_manager.FontProperties(fname='./data/STHeiti Medium.ttc')  # 设置中文字体(图表中能显示中文)# 为了坐标轴上能显示中文plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falsedm_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_managerdef 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.stringname.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 = numelse: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_siblingpl = 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, TScoredef 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

喜欢记得点个赞哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/71657.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息可视化的简单概述

说到信息可视化,很多人肯定还听过数据可视化、知识可视化的概念,这三个之间究竟有什么区别?一般而言需要明确区分这些概念边界是学术界的事情,对于使用可视化的用户来说,则完全没必要纠结在这些细节上。可视化,肯定是因为某个对象不可见或者不怎么容易看到,所以才要将之…

大数据ClickHouse(二十):ClickHouse 可视化工具操作

文章目录 ClickHouse 可视化工具操作 一、tabix 1、直接浏览器访问 2、ClickHouse内嵌方式

01 Python数据可视化:时间序列可视化简明教程

一、效果 相比网上能搜索到的一些讲解时间序列可视化的文章,结果更精美!! 二、时间序列 时间序列(或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。时间序列分析的主要目的是根据已有的历史数据对未来进行预测。经济数据中大多数以时间序列…

[Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望…

基于 Python 的招聘信息可视化分析系统

温馨提示:文末有 CSDN 平台官方提供的博主 Wechat / QQ 名片 :) 1. 项目简介 本项目利用 Python 从某招聘网站抓取海量招聘数据,进行数据清洗和格式化后存储到关系型数据库中(如mysql、sqlite等),利用 Flask Bootst…

2.14 分享9个高吸睛小红书首图制作技巧,要认真学哦!【玩赚小红书】

在小红书里,推荐的图片比例是3:4、1:1、4:3。 做图的时候就要提前调整好比例,免得上传被自动裁剪掉重要信息。竖屏最常用,因为比较“霸屏”,展现的信息空间比较大。当然,选哪个比例还是看个人偏好,尽量保持…

【LLM】如何将开源基础模型训练成特定领域的LLM?

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

大型语言模型的用途是什么?

What Are Large Language Models Used For? 大型语言模型的用途是什么? Large language models recognize, summarize, translate, predict and generate text and other forms of content. 大型语言模型识别、汇总、翻译、预测和生成文本和其他形式的内容。 AI applicatio…

通过生日获取年龄+生肖+星座工具类

通过生日获取年龄生肖星座工具类 🍅 Java学习路线:搬砖工的Java学习路线 🍅 作者:程序员小王 🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF 🍅 扫描主页左侧…

使用生辰八字取名的方法

2019独角兽企业重金招聘Python工程师标准>>> 生辰八字”是我们常说的一种取名的方式,在古代的时候,男女双方是否合适都会拿双方的生辰八字进行匹配,那么该如何使用八字取名呢? 首先我们需要进行测试自己的生辰八字&…

用计算机找到自己的另一半,生辰八字算婚期计算器 免费算个人感情婚姻的另一半...

免费算命东方神算 免费算命2020年最准的免费卜易算 社会高速发展的同时,我们也不能摒弃传统文化,要将科技和文化相结合,现在就有许多网站提供了在线占卜的功能,首页上大大的标题写着类似免费算命东方神算,并且是不是就举办一些免费算命2020年最准的免费卜易算这样比较有噱…

最简单日柱推算法_哪些人在九运中最好运

三元九运是中国划分大时间的方法,自古便记载于黄历上,并结合干支历使用,多用于风水学上。 中国古代先民仰观天文,俯察地理,经过漫长时期的观测,发现太阳系各大行星的运转规律与地球上自然和人事现象的运动变化规律之间存在着某种内在规律性联系。这种天体运行规律循环往复…

万年历、黄历,获取每日的宜忌、五行、冲煞、值神、彭祖百忌、吉神宜趋、今日胎神、凶神宜忌、二十八星宿、建除十二神

环境:jdk8 改写自某万年历js代码,故可能有些代码不规范,不过结果是没问题的。 application.properties jxdata{"1-甲子":{"JSYQ":"天恩 母仓 时阳 生气 益后 青龙","XSYJ":"灾煞 天火 四忌 八…

算命大师元真先生解读周易人生命运

今天我们就来和先生谈谈周易里的人生命运。 元真先生说自古有“易经为群经之首、大道之源”之美誉,为何周易在古代能有如此之高的地位,通观历史我们不难发现,周易是传统思想文化中自然哲学与人文实践的理论的根源,是古代帝王之学,政治家、军事家、商家的必修课。《周易》…

八字喜用神php源码,免费查八字喜用神的软件 通关用神

八字预测学是一项古老的学说,可谓是家喻户晓,过去为无数先人提供了人生经验,经过几千年的传承与发展,理论体系更为完善,所以若是想要自己的人生顺心顺意,了解自己的八字信息势在必行,本期就带您…

感谢周易算命大师元真先生

和大家说说我的亲身经历,也仅以此文感谢周易大师元真先生对我及家人的帮助,以前的我从不信命,也很少算命,但是经历过一次婚姻危机,让我彻底毁了三观,现在拿出来分享给迷茫的人们, 我叫刘小婷一个很单纯的女人,一门心思就围着孩子丈夫家庭转。老公是个很有能力的人,公司…

生辰八字五行计算

本文介绍生辰八字和八字五行的一种算法。站内有人在查询生辰八字的算法,此题本人也感兴趣。故以此文以续貂尾。 生辰八字计算要点是节气日,年柱以立春起,月柱以是月节气日起,故先要计算月首的节气日。本节气算法的节气时刻精度差些…

臭名昭著的手机验证码功能是如何实现的

点击▲关注 “爪哇笔记” 给公众号标星置顶更多精彩 第一时间直达前言 现在基本上各种手机APP注册都会用到手机验证码,包括一些PC端网站也会使用手机号作为唯一标识验证! 恰巧,小明的老板,让其开发一个用户注册的功能&#xff0…

安全机制之手机移动端验证码炸弹处理策略

验证码炸弹处理策略 依据现有软件运行情况分析:用户登陆时忘记密码,需要通过短信验证码的方法登录。由于恶意用户或异常伙伴服务的存在,当系统发生各种故障和错误或受到攻击和侵害(被验证码炸弹袭击)时,系统往往无法正常工作,进而…

技术人员需要了解的手机验证码登录风险

手机验证码登录是一种常见的应用登录方式,简单方便,不用记忆密码,市面上能见到的APP基本都支持这种登录方式,很多应用还把登录和注册集成到了一起,注册登录一气呵成,给用户省去了很多麻烦,颇有一…