Python爬虫:爬取动漫网站的排行榜数据并进行可视化分析
简单介绍
由于哔哩哔哩的网站现在不太方便爬取,我们选择 agefans.com 这个网站完成项目。
我们会爬取排行榜上的数据,并借助可视化手段绘柱状图展示出来。
导入Python库(前提:已经安装了所需的库)
import pandas
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
from matplotlib import font_manager
获取网页内容
# 得到网页的html,并使用bs4修饰
def get_html(url) :
my_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"}
my_response = requests.get(url, headers=my_headers)
my_html = my_response.text
# print(my_html)
my_bs = BeautifulSoup(my_html,"html.parser")
# print(my_bs)
return my_bs
解析网页内容
# 获取排行中的动漫名称
def parse_name(my_bs,my_name,my_attrs,begin,end) :
my_data_1 = []
my_data_2 = []
# 按正确的格式获取排行的所有数据
all_datas = my_bs.findAll(name = my_name,attrs = my_attrs)
# 将排行的所有数据输出到列表中
for data in all_datas :
my_data_1.append(str(data.string))
# 得到指定范围的排行数据
for i in range(begin,end) :
my_data_2.append(my_data_1[i])
return my_data_2
# 获取排行中的动漫播放量
def parse_view(my_bs,my_name,my_attrs,begin,end) :
my_data_1 = []
my_data_2 = []
my_data_3 = []
# 按正确的格式获取排行的所有数据
all_datas = my_bs.findAll(name = my_name,attrs = my_attrs)
# 将排行的所有数据输出到列表中
for data in all_datas :
my_data_1.append(str(data.string))
# 得到指定范围的排行数据
for i in range(begin,end) :
my_data_2.append(my_data_1[i])
# 清除数据中的'w'和',' 并转换为统一的单位
for data in my_data_2 :
if 'w' in data:
new_data = float(data.replace('w', ''))
new_data = int(new_data * 10000)
my_data_3.append(new_data)
else:
new_data = int(data.replace(',', ''))
my_data_3.append(new_data)
return my_data_3
数据可视化分析
# 将排行的动漫名称和相对应的播放量记录到excel表格中
def excel_data(name_anime,view_anime,excel_name) :
info = {'动漫名称': name_anime, '播放量': view_anime}
dm_file = pandas.DataFrame(info)
dm_file.to_excel(excel_name, sheet_name="动漫数据分析")
return info
# 可视化展示
def view(name_anime,view_anime,title_name) :
# name_anime = info[0]
# view_anime = info[1]
# 设置中文字体
my_font = font_manager.FontProperties(fname="C:\\Windows\\Fonts\\SimSun.ttc")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 绘制播放量条形图
fig,ax1 = plt.subplots()
# 设置柱状图
plt.bar(name_anime,view_anime, color='red')
# 设置表的标题
plt.title(title_name, fontproperties=my_font)
ax1.tick_params(labelsize=6)
# 横轴名称
plt.xlabel('动漫名称')
# 纵轴名称
plt.ylabel('播放量')
# 设置横坐标变量名旋转度数和颜色
plt.xticks(rotation=90, color='green')
# 保存至本地
plt.savefig(rf"C:\Users\Public\Desktop\{title_name}.png", dpi=1000, bbox_inches='tight')
# 绘制图像
plt.show()
结果展示(main()调用)
代码如下
def main():
url = "https://www.agedm.org/rank?year=2024"
my_html = get_html(url)
# 获取排行名单
name1 = parse_name(my_html,"a","common_alink",0,50)
name2 = parse_name(my_html,"a","common_alink",50,100)
name3 = parse_name(my_html, "a", "common_alink", 100, 150)
# 获取播放量名单
view1 = parse_view(my_html, "div", "rank_list_item_views", 0, 50)
view2 = parse_view(my_html, "div", "rank_list_item_views", 50, 100)
view3 = parse_view(my_html, "div", "rank_list_item_views", 100, 150)
# 将数据写入excel
excel_data(name1,view1,"anime_data_1.xlsx")
excel_data(name2, view2, "anime_data_2.xlsx")
excel_data(name3, view3, "anime_data_3.xlsx")
# 保存图像 绘制图像
view(name1,view1,"2024年动漫播放量周排行")
view(name2,view2,"2024年动漫播放量月排行")
view(name3,view3,"2024年动漫播放量年排行")
if __name__ == '__main__':
main()
三张柱状图
excel表格中的数据
HTML页面展示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>动漫排行榜数据展示</title>
<style>
img {
max-width: 100%; /* 图片最大宽度为容器的100%,可根据需要调整 */
height: auto; /* 保持图片比例 */
}
h1, h2, p {
font-size: 60px; /* 调整标题和段落文字大小,可根据需要调整 */
}
a {
font-size: 40px; /* 调整链接文字大小,可根据需要调整 */
}
</style>
</head>
<body>
<h1 style="text-align: center;">2024年动漫排行榜数据</h1>
<h2>第一部分:周排行</h2>
<img src="C:\Users\Public\Desktop\2024年动漫播放量周排行.png" alt="2024年动漫播放量周排行">
<p><a href="C:\Users\gxd\Desktop\anime_data_1.xlsx"target="_blank">查看周排行数据Excel文件</a></p>
<p>---------------------------------------------------------------</p>
<h2>第二部分:月排行</h2>
<img src="C:\Users\Public\Desktop\2024年动漫播放量月排行.png" alt="2024年动漫播放量月排行">
<p><a href="C:\Users\gxd\Desktop\anime_data_2.xlsx" target="_blank">查看月排行数据Excel文件</a></p>
<p>---------------------------------------------------------------</p>
<h2>第三部分:年排行</h2>
<img src="C:\Users\Public\Desktop\2024年动漫播放量年排行.png" alt="2024年动漫播放量年排行">
<p><a href="C:\Users\gxd\Desktop\anime_data_3.xlsx" target="_blank">查看年排行数据Excel文件</a></p>
</body>
</html>
完整的代码资源
python代码
# 程序的功能:爬取动漫网站agefans.com的动漫排行榜数据
# 一共有周排行、月排行、年排行三种排行数据,将数据爬取之后存储在excel表格中展示
# 除此之外,我还完成了可视化展示,将数据绘制成了柱状图,更形象地展示排行数据
# 最后,我将所有的结果通过HTML制作成了一个简单的网页
# 以上只是这个程序爬取特定网站的展示
# 我专门将不同的功能整合成了模块化的函数
# 因此,该程序在爬取其他网站的时候只需要在main()中调用需要的函数就可以快速得到数据
# 总而言之,该程序具有广泛的应用范围
import pandas # 处理excel
import requests # 获取HTML
from bs4 import BeautifulSoup # 处理HTML
import matplotlib.pyplot as plt # 绘制柱状图
from matplotlib import font_manager # 设置字体
# 得到网页的html,并使用bs4修饰
def get_html(url) :
my_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"}
my_response = requests.get(url, headers=my_headers)
my_html = my_response.text
# print(my_html)
my_bs = BeautifulSoup(my_html,"html.parser")
# print(my_bs)
return my_bs
# 获取排行中的动漫名称
def parse_name(my_bs,my_name,my_attrs,begin,end) :
my_data_1 = []
my_data_2 = []
# 按正确的格式获取排行的所有数据
all_datas = my_bs.findAll(name = my_name,attrs = my_attrs)
# 将排行的所有数据输出到列表中
for data in all_datas :
my_data_1.append(str(data.string))
# 得到指定范围的排行数据
for i in range(begin,end) :
my_data_2.append(my_data_1[i])
return my_data_2
# 获取排行中的动漫播放量
def parse_view(my_bs,my_name,my_attrs,begin,end) :
my_data_1 = []
my_data_2 = []
my_data_3 = []
# 按正确的格式获取排行的所有数据
all_datas = my_bs.findAll(name = my_name,attrs = my_attrs)
# 将排行的所有数据输出到列表中
for data in all_datas :
my_data_1.append(str(data.string))
# 得到指定范围的排行数据
for i in range(begin,end) :
my_data_2.append(my_data_1[i])
# 清除数据中的'w'和',' 并转换为统一的单位
for data in my_data_2 :
if 'w' in data:
new_data = float(data.replace('w', ''))
new_data = int(new_data * 10000)
my_data_3.append(new_data)
else:
new_data = int(data.replace(',', ''))
my_data_3.append(new_data)
return my_data_3
# 将排行的动漫名称和相对应的播放量记录到excel表格中
def excel_data(name_anime,view_anime,excel_name) :
info = {'动漫名称': name_anime, '播放量': view_anime}
dm_file = pandas.DataFrame(info)
dm_file.to_excel(excel_name, sheet_name="动漫数据分析")
return info
# 可视化展示
def view(name_anime,view_anime,title_name) :
# name_anime = info[0]
# view_anime = info[1]
# 设置中文字体
my_font = font_manager.FontProperties(fname="C:\\Windows\\Fonts\\SimSun.ttc")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 绘制播放量条形图
fig,ax1 = plt.subplots()
# 设置柱状图
plt.bar(name_anime,view_anime, color='red')
# 设置表的标题
plt.title(title_name, fontproperties=my_font)
ax1.tick_params(labelsize=6)
# 横轴名称
plt.xlabel('动漫名称')
# 纵轴名称
plt.ylabel('播放量')
# 设置横坐标变量名旋转度数和颜色
plt.xticks(rotation=90, color='green')
# 保存至本地
plt.savefig(rf"C:\Users\Public\Desktop\{title_name}.png", dpi=1000, bbox_inches='tight')
# 绘制图像
plt.show()
def main():
url = "https://www.agedm.org/rank?year=2024"
my_html = get_html(url)
# 获取排行名单
name1 = parse_name(my_html,"a","common_alink",0,50)
name2 = parse_name(my_html,"a","common_alink",50,100)
name3 = parse_name(my_html, "a", "common_alink", 100, 150)
# 获取播放量名单
view1 = parse_view(my_html, "div", "rank_list_item_views", 0, 50)
view2 = parse_view(my_html, "div", "rank_list_item_views", 50, 100)
view3 = parse_view(my_html, "div", "rank_list_item_views", 100, 150)
# 将数据写入excel
excel_data(name1,view1,"anime_data_1.xlsx")
excel_data(name2, view2, "anime_data_2.xlsx")
excel_data(name3, view3, "anime_data_3.xlsx")
# 保存图像 绘制图像
view(name1,view1,"2024年动漫播放量周排行")
view(name2,view2,"2024年动漫播放量月排行")
view(name3,view3,"2024年动漫播放量年排行")
if __name__ == '__main__':
main()
HTML代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>动漫排行榜数据展示</title>
<style>
img {
max-width: 100%; /* 图片最大宽度为容器的100%,可根据需要调整 */
height: auto; /* 保持图片比例 */
}
h1, h2, p {
font-size: 60px; /* 调整标题和段落文字大小,可根据需要调整 */
}
a {
font-size: 40px; /* 调整链接文字大小,可根据需要调整 */
}
</style>
</head>
<body>
<h1 style="text-align: center;">2024年动漫排行榜数据</h1>
<h2>第一部分:周排行</h2>
<img src="C:\Users\Public\Desktop\2024年动漫播放量周排行.png" alt="2024年动漫播放量周排行">
<p><a href="C:\Users\gxd\Desktop\anime_data_1.xlsx"target="_blank">查看周排行数据Excel文件</a></p>
<p>---------------------------------------------------------------</p>
<h2>第二部分:月排行</h2>
<img src="C:\Users\Public\Desktop\2024年动漫播放量月排行.png" alt="2024年动漫播放量月排行">
<p><a href="C:\Users\gxd\Desktop\anime_data_2.xlsx" target="_blank">查看月排行数据Excel文件</a></p>
<p>---------------------------------------------------------------</p>
<h2>第三部分:年排行</h2>
<img src="C:\Users\Public\Desktop\2024年动漫播放量年排行.png" alt="2024年动漫播放量年排行">
<p><a href="C:\Users\gxd\Desktop\anime_data_3.xlsx" target="_blank">查看年排行数据Excel文件</a></p>
</body>
</html>
原文地址:https://blog.csdn.net/2402_86320900/article/details/144324892
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!