Python爬虫:爬取动漫网站的排行榜数据并进行可视化分析

news2024/12/13 2:26:25

简单介绍

        由于哔哩哔哩的网站现在不太方便爬取,我们选择 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.coloradmin.cn/o/2256770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis快速入门(下)

MyBatis快速入门&#xff08;下&#xff09; 六、MyBatis-缓存机制1、一级缓存&#xff08;Local Cache&#xff09;2、二级缓存&#xff08;Global Cache&#xff09;二级缓存标签属性介绍缓存相关设置 3、第三方缓存Mybatis整合ehcache示例 七、MyBatis-逆向工程1、targetRun…

华为TaurusDB与GaussDB:信创改造的“降本提效”之路

近年来&#xff0c;信创&#xff08;信息技术应用创新&#xff09;已成为中国国央企数字化转型的关键词。伴随这一浪潮&#xff0c;众多企业面临一个迫切问题&#xff1a;如何在兼顾性能与成本的前提下&#xff0c;完成核心系统的迁移改造&#xff1f;华为TaurusDB和GaussDB的加…

【Linux】文本处理三剑客:grep、sed 和 awk

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

【前端】理解 JavaScript 对象属性访问的复杂性

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;理论基础&#xff1a;JavaScript 对象属性的访问模式1. 点符号访问&#xff08;Dot Notation&#xff09;2. 方括号访问&#xff08;Bracket Notation&#xff09;点符号…

【工具变量】上市公司企业研发不确定性数据(2013-2023年)

一、测算方式&#xff1a;参考顶刊《中国工业经济》孙薇&#xff08;2023&#xff09;老师的做法&#xff0c;本文从专利的申请与授权的视角出发&#xff0c;以企业当年申请的发明专利中最终未被授权的比例度量研发不确定性 &#xff08;uc&#xff09;。这是因为&#xff0c;相…

easyExcel单一下拉框和级联下拉框

文章目录&#xff1a; 单一下拉框级联下拉框 具体实现&#xff1a; 单一下拉框 public class BoolWriteHandler implements SheetWriteHandler {private List<String> dropDown;private List<Integer> indexList;public BoolWriteHandler(List<Integer> i…

【C++】指针与智慧的邂逅:C++内存管理的诗意

文章目录 RAII 智能指针auto_ptrunique_ptr shared_ptr模拟实现定制删除器循环引用 和 weak_ptr RAII RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种广泛应用于 C 等编程语言中的编程范式&#xff0c;它的核心思想是&#xff1a;资源的获取和释放…

【优选算法 位运算】位运算算法入门详解:常见位运算总结

判定字符是否唯一 题目解析 算法原理 解法一 &#xff1a;哈希数组 从前往后扫描字符串&#xff0c;把扫描到的字符先进行判断&#xff0c;如果对应的 val 0 &#xff0c;则放入哈希表中&#xff0c;否则返回 false&#xff0c;知道扫描完整个字符&#xff1b;时间…

深入理解Linux进程管理机制

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言 进程是现代操作系统中一个不可或缺的概念&#xff0c;其主要目的在于管理资源、实现并发、提高系统效率&#xff0c;并确保系统的稳定性和安全性。 进程的定义 进程&#xff08;Process&#xff09; 是计算机操作系统中…

R 语言科研绘图第 4 期 --- 折线图-置信区间

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

springSecurity自定义登陆接口和JWT认证过滤器

下面我会根据该流程图去自定义接口&#xff1a; 我们需要做的任务有&#xff1a; 登陆&#xff1a;1、通过ProviderManager的方法进行认证&#xff0c;生成jwt&#xff1b;2、把用户信息存入redis&#xff1b;3、自定义UserDetailsService实现到数据库查询数据的方法。 校验&a…

使用 LabVIEW 与 PLC 通信的方式

要将 PLC 与 LabVIEW 或其他 NI 产品进行通信&#xff0c;首先需要明确 PLC 支持的通信协议和接口类型。NI 提供了多种方案&#xff0c;包括 OPC 服务器、Modbus、Ethernet/IP 和其他工业通信协议。下面将详细介绍这些方法&#xff0c;并进行比较分析&#xff0c;帮助你选择最适…

软考高级架构-9.4.4-双机热备技术 与 服务器集群技术

一、双机热备 1、特点&#xff1a; 软硬件结合&#xff1a;系统由两台服务器&#xff08;主机和备机&#xff09;、一个共享存储&#xff08;通常为磁盘阵列柜&#xff09;、以及双机热备软件&#xff08;提供心跳检测、故障转移和资源管理功能的核心软件&#xff09;组成。 …

专题二十五_动态规划_两个数组的 dp (含字符串数组)_算法专题详细总结

目录 动态规划_两个数组的 dp &#xff08;含字符串数组&#xff09; 1. 最⻓公共⼦序列&#xff08;medium&#xff09; 解析&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a;​编辑 4. 填表顺序&#xff1a;​编辑 5. 返回值…

12,攻防世界simple_php

simple_php 题目来源:Cyberpeace-n3k0 题目描述: 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 进入靶场 这段PHP代码是一个简单的web应用示例&#xff0c;让我们逐步分析这段代码&#xff1a; show_source(__FILE__);&#xff1a;这行代码会显示当前文件的…

NIO - selector简单介绍

一 前言 selector作为NIO当中三大组件之一&#xff0c;是处理NIO非阻塞模式下的核心组件&#xff0c;它允许一个单个线程管理多个通道。 NIO下的阻塞模式 因为对于阻塞模式下的NIO模式&#xff0c;存在很大的问题&#xff0c;即使在单线程下&#xff0c;对应的服务端也会一直进…

二、部署docker

二、安装与部署 2.1 安装环境概述 Docker划分为CE和EE&#xff0c;CE为社区版&#xff08;免费&#xff0c;支持周期三个月&#xff09;&#xff0c;EE为企业版&#xff08;强调安全&#xff0c;付费使用&#xff09;。 Docker CE每月发布一个Edge版本&#xff08;17.03&…

Camp4-L2:LMDeploy 量化部署进阶实践

书生浦语大模型实战营第四期&#xff1a;LMDeploy 量化部署进阶实践 教程链接&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L2/LMDeploy视频链接&#xff1a;https://www.bilibili.com/video/BV18aUHY3EEG/?vd_sourceb96c7e6e6d1a48e73edafa36a36f1697…

Qt之第三方库QCustomPlot使用(二)

Qt开发 系列文章 - qcustomplot&#xff08;二&#xff09; 目录 前言 一、Qt开源库 二、QCustomPlot 1.qcustomplot介绍 2.qcustomplot下载 3.qcustomplot移植 4.修改项目文件.pro 5.提升QWidget类‌ 三、技巧讲解 1.拖动缩放功能 2.等待更新 总结 前言 Qt第三方…

python数据分析之爬虫基础:selenium详细讲解

目录 1、selenium介绍 2、selenium的作用&#xff1a; 3、配置浏览器驱动环境及selenium安装 4、selenium基本语法 4.1、selenium元素的定位 4.2、selenium元素的信息 4.3、selenium元素的交互 5、Phantomjs介绍 6、chrome handless模式 1、selenium介绍 &#xff08;1…