首页 > 其他分享 >4.28

4.28

时间:2024-06-05 22:35:10浏览次数:20  
标签:plt df university rank 4.28 year print

python爬取

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

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

(2)结合matplotlib库,对2015-2019年间前10位大学的排名信息进行可视化展示。(2020-2024)15-19官网已更新,找不到了

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

复制代码
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
from matplotlib import pyplot as plt


def get_rank(url):
    rank = []
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36 Edg/101.0.1210.3"
    }
    resp = requests.get(url, headers=headers)
    if resp.status_code != 200:
        print(f"Failed to retrieve data from {url}")
        return rank

    soup = bs(resp.content, "lxml")
    rows = soup.select("#content-box > div.rk-table-box > table > tbody > tr")
    for row in rows[:10]:  # 获取前10个排名
        university = row.select_one(".name-cn").text.strip()
        score = row.select("td:nth-child(5)")[0].text.strip()
        rank.append([university, score])
    return rank


total = []
years = range(2020, 2025)
for year in years:
    url = f"https://www.shanghairanking.cn/rankings/bcur/{year}10"
    print(f"Fetching data from: {url}")
    title = ['学校名称', '总分']
    df = pd.DataFrame(get_rank(url), columns=title)
    total.append(df)

    # 画图
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    x = list(df["学校名称"])[::-1]
    y = list(df["总分"])[::-1]
    plt.figure(figsize=(20, 8), dpi=100)
    plt.plot(x, y, label="大学排名", marker='o')
    plt.grid(True, linestyle="--", alpha=0.5)
    plt.xlabel("大学名称")
    plt.ylabel("总分")
    plt.title(f"{year}年软科中国最好大学排名Top10", fontsize=20)
    plt.legend(loc="best")
    plt.savefig(f"{year}.png")
    plt.show()


# 查询功能
def query_ranking():
    while True:
        info = input("请输入要查询的大学名称和年份(格式:大学名称 年份):")
        try:
            university, year = info.split()
            year = int(year)
            if year in years:
                index = year - 2020
                df = total[index]
                if university in df["学校名称"].values:
                    rank = df[df["学校名称"] == university].index[0] + 1
                    print(f"{university}在{year}年排名第{rank}")
                else:
                    print("很抱歉,没有该学校的排名记录!!!")
            else:
                print("很抱歉,没有该年份的排名记录!!!")
        except ValueError:
            print("输入格式错误,请输入大学名称和年份(格式:大学名称 年份)")

        select = input("请选择以下选项:\n   1.继续查询\n   2.结束查询\n")
        if select == '2':
            break


if __name__ == "__main__":
    query_ranking()

标签:plt,df,university,rank,4.28,year,print
From: https://www.cnblogs.com/Christmas77/p/18234045

相关文章

  • #22 2024.4.28
    817.loj4143「CCO2019」Sirtet818.loj3364「IOI2020」植物比较819.loj3367「IOI2020」装饼干820.loj3389「NOIP2020」微信步数?计算第\(kn+i\)步还没死的人的个数。每一维是个一次函数,卷起来是个\(k\)次函数,前缀和是\(k+1\)次函数。做完了???821.uoj569【I......
  • [转载]好一件“建安”轶事[2016.4.28 sina blog]
    原文地址:好一件“建安”轶事作者:刘宏斌    本来是饶有兴致地陪葛浪静老师赶场京戏,以庆祝他的68岁生日,却不曾想被疯狂的BUS拉坏了爱车的后视镜而懊恼起来。    直到乐池顿起了久违的鸣响,心才回归。    不错,真的很不错,八零后万晓慧担纲,江峰等一拨一级“大腕”捧哏,虽是......
  • 2024.4.28 近期练习
    P6619[省选联考2020A/B卷]冰火战士对于一次战斗,冰火两方能量较少的那方会耗尽,答案为这个能量的两倍。我们就是要找一个中间值,左边的冰战士能量值之和与右边火战士能量值之和最小值最大。离散化,我们可以二分找到第一个冰的前缀和大于火的后缀和的位置\(p\),答案为\(p-1\)......
  • 4.28
    我给你瘦落的街道、绝望的落日、荒郊的月亮。我给你一个久久地望着孤月的人的悲哀。我给你我已死去的祖辈,后人们用大理石祭奠的先魂我父亲的父亲,阵亡于布宜诺斯艾利斯的边境,两颗子弹射穿了他的胸膛,死的时候蓄着胡子,尸体被士兵们用牛皮裹起;我母亲的祖父——那年才二十四岁——......
  • 五一集训讲课内容(4.28-5.2)
    五一集训讲课内容(4.28-5.2)比赛注意开头写文件读入、写出的两行代码。freopen("文件名.in","r",stdin);freopen("文件名.out","w",stdout);内存限制为256MB最多开6e7的int型数组内存限制为512MB最多开1e8的int型数组1e9的数组绝不能开!!!时间限制1000ms,for循环最多循环1e9......
  • 2015.4.28_正则表达式_正则表达式简易教程
    为什么使用正则表达式通过正则表达式,可以:测试字符串内的模式。例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。替换文本。可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。基于模式匹配从字符串中提......
  • KubeSphere 社区双周报 | 开源之夏已启动 | 2023.04.28-05.11
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.04.28-2023.05.11。贡献者名单新晋KubeSphereCon......
  • 4.28学习总结
    Android学习——控件TextView 1.基本2.带阴影的3.跑马灯效果......
  • 2023.4.28《人月神话》读后感
    第二章 人月神话1.缺乏合理的时间进度控制是造成滞后的主要原因,比其他任何事情影响的和还大;2.好的东西需要一些时间来沉淀;3.似乎所有的程序员都是“乐观主义者”;4.期待不会有困难;5.本身构思是有BUG的;6.围绕成本核算的估计技术,混淆了工作量和项目进展;7.若干人员中分解任务会引发......
  • 4.28
    #include<iostream>usingnamespacestd;classperson{public:person(){cout<<"person的无参构造函数的调用"<<endl;}person(inta){age=a;cout<<"person的有参构造函数的调用"<<endl;}person(constperson&p){......