当前位置: 首页 > article >正文

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>

http://www.kler.cn/a/430187.html

相关文章:

  • 基于 Python 自动化接口测试(踩坑与实践)
  • 快速实现一个快递物流管理系统:实时更新与状态追踪
  • 企业级PHP异步RabbitMQ协程版客户端 2.0 正式发布
  • web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理
  • 无网络时自动切换备用网络环境
  • 单片机软件定时器V4.0
  • docker-compose 部署 mysql redis nginx nacos seata sentinel
  • Halcon 轮廓检测常用算子、原理及应用场景
  • PHP和GD库如何将图片转换为黑白图
  • Unity类银河战士恶魔城学习总结(P167 Blackhole additional vfx 黑洞技能额外特效)
  • 2023年第十四届蓝桥杯Scratch02月stema选拔赛真题-王子与骑士
  • 第三十九篇——条件概率和贝叶斯公式:机器翻译是怎么工作的?
  • 执行“go mod tidy”遇到“misbehavior”错误
  • 2024年华中杯数学建模C题基于光纤传感器的平面曲线重建算法建模解题全过程文档及程序
  • 【算法笔记】前缀和算法原理深度剖析(超全详细版)
  • gozero项目迁移与新服务器环境配置,包含服务器安装包括go版本,Nginx,项目配置包括Mysql,redis,rabbit,域名
  • 使用 Postman 上传二进制类型的图片到后端接口写法
  • 通俗易懂理解:网络安全恶意节点的检测与哨兵节点的激活【论文+代码】
  • 杨振宁大学物理视频中黄色的字,c#写程序去掉
  • net8 WebAP Swagger
  • JS中的原型链与继承
  • PyTorch张量的backward方法和.grad属性介绍
  • 鸿蒙Next开发实战教程-使用WebSocket实现即时聊天
  • 如何实现多级缓存以及缓存之间数据的一致性
  • vscode鼠标右键跳转到定义只能跳转到头文件
  • C++ 列表初始化(initializer_list)