增补博客 第八篇 python 中国大学排名数据分析与可视化

【题目描述】以软科中国最好大学排名为分析对象,基于requests库和bs4库编写爬虫程序,对2015年至2019年间的中国大学排名数据进行爬取:

(1)按照排名先后顺序输出不同年份的前10位大学信息,并要求对输出结果的排版进行优化;

(2)结合matplotlib库,对2015-2019年间前10位大学的排名信息进行可视化展示。

(3附加)编写一个查询程序,根据从键盘输入的大学名称和年份,输出该大学相应的排名信息。如果所爬取的数据中不包含该大学或该年份信息,则输出相应的提示信息,并让用户选择重新输入还是结束查询;

【练习要求】请给出源代码程序和运行测试结果,源代码程序要求添加必要的注释。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
from sympy.physics.control.control_plots import matplotlib
 
plt.rcParams['font.sans-serif']=['SimHei']    # 用来设置字体样式以正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    # 默认是使用Unicode负号,设置正常显示字符,如正常显示负号
 
 
# 设置请求头部信息
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}
 
def get_ranking(year):
    url = f'https://www.shanghairanking.cn/rankings/bcur/{year}.html'
    # 发送HTTP请求以获取网页内容
    response = requests.get(url, headers=headers)
    # 检查请求是否成功
    if response.status_code == 200:
        # 使用BeautifulSoup解析HTML内容
        soup = BeautifulSoup(response.content, 'html.parser')
        # 找到包含大学信息的表格
        table = soup.find('table', class_='rk-table')
        # 提取前10所大学的信息
        universities = table.find_all('tr', {'data-v-90b0d2ac': True})[1:11# 排除表头行
        # 存储排名数据的列表
        ranking_data = []
        for university in universities:
            rank_element = university.find('td', {'data-v-90b0d2ac': True})
            # 检查排名元素是否存在
            if rank_element:
                rank = rank_element.text.strip()
                name = university.find('a').text.strip()
                # 将排名数据存储到列表中
                ranking_data.append({"排名": rank, "名称": name})
        return ranking_data
    else:
        print("请求失败。状态码:", response.status_code)
 
 
def main():
    # 1. 获取并输出前10位大学信息
    for year in range(2015, 2020):
        ranking_data = get_ranking(year)
        if ranking_data:
            print(f"{year}年前10所大学:")
            for data in ranking_data:
                print(f"{data['排名']}. {data['名称']}")
            print()
            # 创建一个表格的figure
            fig, ax = plt.subplots()
            # 隐藏坐标轴
            ax.axis('off')
            # 创建表格
            table = ax.table(cellText=[list(data.values()) for data in ranking_data], colLabels=list(ranking_data[0].keys()), loc='center')
            # 调整表格字体大小
            table.auto_set_font_size(False)
            table.set_fontsize(12)
            # 调整单元格高度
            table.scale(1, 1.5)
            # 显示表格
            plt.title(f"{year}年,中国软科排名前十的大学", pad=20)
            plt.show()
        else:
            print(f"未能获取{year}年的大学排名数据。")
 
def get_specific_ranking(university, year):  # Renamed the function
    # 构建URL
    url = f'https://www.shanghairanking.cn/rankings/bcur/{year}.html'
 
    # 发送HTTP请求
    response = requests.get(url)
 
    # 检查响应状态码
    if response.status_code == 200:
        # 使用BeautifulSoup解析HTML内容
        soup = BeautifulSoup(response.content, 'html.parser')
        # 找到包含大学信息的表格
        table = soup.find('table', class_='rk-table')
        # 提取前30所大学的信息
        universities = table.find_all('tr', {'data-v-90b0d2ac': True})[1:31# 排除表头行
        # 存储排名数据的列表
        ranking_data = []
        for university_row in universities:
            name_element = university_row.find('a')
            # 检查大学名称元素是否存在
            if name_element:
                name = name_element.text.strip()
                # 检查大学名称是否与输入的大学名称匹配
                if name == university:
                    rank_element = university_row.find('td', {'data-v-90b0d2ac': True})
                    if rank_element:
                        rank = rank_element.text.strip()
                        print(f"{year} 年 {university} 排名是 {rank}")
                        return rank
        # 如果未找到匹配的大学名称,打印消息
        print(f"找不到 {university} 在 {year} 年的排名信息。")
    else:
        print("请求失败。状态码:", response.status_code)
 
 
 
if __name__ == "__main__":
    main()
    while True:
        university = input("请输入大学名称(输入 '退出' 结束查询):")
        if university.lower() == '退出':
            break
        year = input("请输入年份:")
        print(get_specific_ranking(university, year))

  

 

posted @   财神给你送元宝  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示