热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python爬虫以及数据可视化分析!这才是零基础入门案例!

简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析下面,我们开始吧!PS:作为Python爬虫初学者&

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

下面,我们开始吧!

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

(二)通过PyCharm下载

第一步:编译器左上角File–>Settings…
image.png
第二步:找到Project Interpreter 点击右上角加号按钮,弹出界面上方搜索库名:requests,点击左下角Install ,当提示successfully时,即安装完成。
2.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

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

喜欢记得点个赞哦~

如何获取源码:

①3000多本Python电子书有
②Python开发环境安装教程有
③Python400集自学视频有
④软件开发常用词汇有
⑤Python学习路线图有
⑥项目源码案例分享有
如果你用得到的话可以直接拿走,在我的QQ技术交流群里群号:754370353(纯技术交流和资源共享,广告勿入)以自助拿走
点击这里 领取


推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
手机用户2502923413
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有