自学内容网 自学内容网

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)!