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

爬虫与数据分析结合:中国大学排名案例学习报告

一、项目背景与目标

在信息爆炸的时代,高效获取并分析公开数据对决策制定具有重要意义。中国大学排名作为考生择校、教育研究的重要参考依据,其数据的系统性收集与分析尤为关键。本次项目旨在通过爬虫技术获取高三网中国大学排名数据,结合数据分析与可视化方法,深入挖掘数据背后的信息,掌握从数据获取到解读的完整流程。

本次项目的具体目标包括:

  • 爬取高三网(2021中国的大学排名一览表_高三网)上中国大学排名的相关数据,涵盖学校名称、总分、全国排名、星级排名、办学层级等信息。
  • 将爬取的数据存储为 CSV 文件,便于后续处理。
  • 对数据进行预处理,处理其中的缺失值。
  • 运用数据可视化技术,以柱形图、饼图等形式展示不同星级学校的数量及占比情况,直观呈现数据特征。

二、数据爬取过程

(一)任务分析

本次爬取的目标网页包含中国大学排名一览表,数据以表格形式呈现。通过查看网页源码可知,数据存储在table标签下的tbody中,每一行数据对应一所大学的信息,包含名次、学校名称、总分、全国排名、星级排名、办学层级等字段。因此,爬取思路为发送 HTTP 请求获取网页内容,解析 HTML 结构提取目标数据,最后将数据保存为 CSV 文件。

(二)代码实现

  1. 获取网页内容
    通过requests库发送 GET 请求获取网页 HTML 文本。定义get_html函数,实现通用的 GET 请求功能,设置超时时间,处理编码问题及请求异常。
    import requests
    def get_html(url, time=3):try:r = requests.get(url, timeout=time)r.encoding = r.apparent_encodingr.raise_for_status()return r.textexcept Exception as error:print(error)

  2. 解析网页数据
    使用BeautifulSoup库解析 HTML 文本。定义parser函数,通过选择器定位表格中的行和列,提取学校名称、总分、全国排名、星级排名、办学层级等信息,存储到列表中。
    from bs4 import BeautifulSoup
    def parser(html):soup = BeautifulSoup(html, "lxml")out_list = []for row in soup.select("table>tbody>tr"):td_html = row.select("td")row_data = [td_html[1].text.strip(),  # 学校名称td_html[2].text.strip(),  # 总分td_html[3].text.strip(),  # 全国排名td_html[4].text.strip(),  # 星级排名td_html[5].text.strip()   # 办学层次]out_list.append(row_data)return out_list

  3. 保存数据到 CSV
    定义save_csv函数,使用csv库将解析得到的列表数据写入 CSV 文件,设置编码为 utf-8,避免中文乱码。
    import csv
    def save_csv(item, path):with open(path, "wt", newline="", encoding="utf-8") as f:csv_write = csv.writer(f)csv_write.writerows(item)

    主函数执行流程
    在主函数中,依次调用上述函数,完成从获取网页、解析数据到保存数据的全过程

    if __name__ == "__main__":url = "http://www.bspider.top/gaosan/"html = get_html(url)out_list = parser(html)save_csv(out_list, "school.csv")

    (三)运行结果

    运行代码后,成功生成school.csv文件,文件中包含了 820 所大学的相关信息。部分数据如下:

    学校名称,总分,全国排名,星级排名,办学层次
    北京大学,100,1,8★,世界一流大学
    清华大学,99.81,2,8★,世界一流大学
    浙江大学,80.72,4,8★,世界一流大学
    ...

    三、数据预处理

    在获取的school.csv数据中,发现 “总分” 列存在部分空数据。为保证后续分析的准确性,采用 pandas 库对缺失数据进行处理,主要有以下四种方法:

    1删除包含空字段的行

  4. 使用dropna()函数删除所有包含空值的行,得到一个无缺失值的新数据集。

    import pandas as pd
    df = pd.read_csv("school.csv")
    new_df = df.dropna()
    print(new_df.to_string())

  5. 用指定内容替换空字段
    使用fillna()函数将空值替换为 “暂无分数信息”,明确标识缺失数据。
    import pandas as pd
    df = pd.read_csv("school.csv")
    df.fillna("暂无分数信息", inplace=True)
    print(df.to_string())

  6. 计算列的均值替换空单元格
    先计算 “总分” 列的均值,再用均值填充空值,适用于数据分布较为均匀的情况。
import pandas as pd
df = pd.read_csv("school.csv")
x = df["总分"].mean()
print("总分的均值为")
print(x)
df["总分"].fillna(x, inplace=True)
print(df.to_string())
  1. 计算列的中位数替换空单元格
    计算 “总分” 列的中位数,用中位数填充空值,相比均值更能抵抗极端值的影响。
    import pandas as pd
    df = pd.read_csv("school.csv")
    x = df["总分"].median()
    print("总分的中位数为")
    print(x)
    df["总分"].fillna(x, inplace=True)
    print(df.to_string())

    四、数据分析与可视化

    (一)不同星级学校数量分析

    该网站收录的 820 所学校中,不同星级的学校数量分布如下:8 星学校 8 所,7 星学校 16 所,6 星学校 36 所,5 星学校 59 所,4 星学校 103 所,3 星学校 190 所,2 星学校 148 所,1 星学校 260 所。为直观展示这一分布,使用 matplotlib 绘制柱形图。

    import matplotlib.pyplot as plt
    import numpy as np
    x = np.array(["8星", "7星", "6星", "5星", "4星", "3星", "2星", "1星"])
    y = np.array([8, 16, 36, 59, 103, 190, 148, 260])
    plt.title("不同星级的学校个数")
    plt.rcParams["font.sans-serif"] = ["SimHei"]  # 解决中文显示问题
    plt.bar(x, y)
    plt.show()

    图形显示,3 星和 1 星学校数量较多,8 星学校数量最少,整体呈现中间多、两端少的分布趋势。

  2. 水平柱形图
    将柱形图方向改为水平,更便于比较不同星级学校数量的多少。
    import matplotlib.pyplot as plt
    import numpy as np
    x = np.array(["8星", "7星", "6星", "5星", "4星", "3星", "2星", "1星"])
    y = np.array([8, 16, 36, 59, 103, 190, 148, 260])
    plt.title("不同星级的学校个数")
    plt.rcParams["font.sans-serif"] = ["SimHei"]
    plt.barh(x, y)
    plt.show()

    (二)不同星级学校占比分析

    各星级学校在总数量中的占比为:8 星约 1%,7 星约 2%,6 星约 4.5%,5 星约 7.2%,4 星约 12.5%,3 星约 23.1%,2 星约 18%,1 星约 31.7%。为展示各星级学校的占比情况,绘制饼图如下:

    import matplotlib.pyplot as plt
    import numpy as np
    y = np.array([1, 2, 4.5, 7.2, 12.5, 23.1, 18, 31.7])
    plt.pie(y, labels=["8星", "7星", "6星", "5星", "4星", "3星", "2星", "1星"])
    plt.title("不同星级的学校个数占比")
    plt.rcParams["font.sans-serif"] = ["SimHei"]
    plt.show()

    饼图清晰地展示了 1 星学校占比最高,接近三分之一,而 8 星学校占比最低,仅为 1%,反映出我国高等教育机构的层次结构特征。

    五、学习心得与总结

    通过本次中国大学排名爬取与数据分析项目,我系统掌握了从数据获取到分析可视化的完整流程,收获颇丰。

     

    在数据爬取方面,深入理解了 requests 库发送 HTTP 请求、BeautifulSoup 库解析 HTML 的原理和方法,学会了根据网页结构设计合理的解析逻辑,成功获取了目标数据。同时,也认识到在爬取过程中需要注意异常处理,确保程序的稳定性。

     

    数据预处理环节让我体会到数据清洗对于后续分析的重要性。针对缺失值的不同处理方法各有优劣,在实际应用中需根据数据特点和分析需求选择合适的方法,以保证数据质量。

    数据分析与可视化则让我感受到数据呈现的魅力。通过柱形图、饼图等可视化工具,原本庞杂的数据变得直观易懂,能够快速发现数据中的规律和特征。matplotlib 库的使用虽然简单,但细节处理(如中文显示)对图形效果影响较大,需要格外注意。

     

    当然,本次项目也存在一些不足,例如爬取的网页结构相对简单,对于动态加载或需要登录的网页爬取能力还有待提升;数据分析仅涉及简单的数量和占比分析,缺乏更深入的挖掘。

     

    未来,我将继续学习更高级的爬虫技术,如处理动态网页、使用代理 IP 等,同时加强数据分析方法的学习,运用统计分析、机器学习等手段挖掘数据更深层次的价值,不断提升自己的数据处理与分析能力。

http://www.lryc.cn/news/618079.html

相关文章:

  • TDengine IDMP 基本功能(2.数据建模)
  • 爬虫与数据分析结和
  • 爬虫与数据分析入门:从中国大学排名爬取到数据可视化全流程
  • MySQL详细安装
  • 《算法导论》第 18 章 - B 树
  • 【MYSQL】MySQL中On duplicate key update
  • Dify入门指南(2):5 分钟部署 Dify:云服务 vs 本地 Docker
  • Python自动化测试实战:reCAPTCHA V3绕过技术深度解析
  • 常见鱼饵制作方式
  • Flutter学习笔记(六)---状态管理、事件、路由、动画
  • Vuex和Pina的区别
  • Prompt Engineering 最佳实践:让AI输出更精准的核心技巧
  • MaixPy简介
  • 贪心----2.跳跃游戏
  • 【09】中兴通讯——中兴 软件工程师 第一轮一面,技术面,校招,面试问答记录
  • QML的中英文翻译
  • OpenCV计算机视觉实战(19)——特征描述符详解
  • 【前端基础】16、结构伪类(注:粗略说明)
  • Facebook广告投放进阶:ABO精测与CBO放量的协同增长策略
  • 计算机网络---DNS(域名系统)
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的多目标跟踪与行为分析优化(393)
  • [Ubuntu] xrdp共享连接 Ubuntu 屏幕 | xfce4
  • 爬虫与数据分析结合案例
  • C++11的历史和统一的初始化列表
  • 数据填报是什么?数据填报工具有哪些?
  • 蓝桥杯算法之搜索章 - 4
  • 【单板硬件开发】关于复位电路的理解
  • 掌握do-while循环:从语法到运用
  • 18.5 BERT评估指标终极指南:HuggingFace实战提升文本分类效果
  • 【LeetCode刷题集】--排序(三)