8-1 【Python0025】中国大学排名数据分析与可视化 分数 10 作者 doublebest 单位 石家庄铁道大学
【题目描述】以软科中国最好大学排名为分析对象,基于requests库和bs4库编写爬虫程序,对2015年至2019年间的中国大学排名数据进行爬取:
(1)按照排名先后顺序输出不同年份的前10位大学信息,并要求对输出结果的排版进行优化;
(2)结合matplotlib库,对2015-2019年间前10位大学的排名信息进行可视化展示。
(3附加)编写一个查询程序,根据从键盘输入的大学名称和年份,输出该大学相应的排名信息。如果所爬取的数据中不包含该大学或该年份信息,则输出相应的提示信息,并让用户选择重新输入还是结束查询;
【练习要求】请给出源代码程序和运行测试结果,源代码程序要求添加必要的注释。
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))