2024/5/22

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

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

(2)结合matplotlib库,对2015-2019年间前10位大学的排名信息进行可视化展示。
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False 

# 爬取数据
def scrape_university_ranking(year):
    url = f'https://www.shanghairanking.cn/rankings/bcur/{year}.html'
    response = requests.get(url)

    if response.status_code == 200: # 确保请求成功
        soup = BeautifulSoup(response.content, 'html.parser')

        universities = []
        ranks = []

        for row in soup.find_all('tr')[1:]:
            columns = row.find_all('td')
            rank = columns[0].get_text()
            university = columns[1].get_text().strip()
            universities.append(university)
            ranks.append(int(rank))

        return universities, ranks
    else:
        print(f"无法获取{year}年的大学排名数据")

    return [], []

# 可视化展示
def plot_ranking(years, top_n=10):
    for year in years:
        universities, ranks = scrape_university_ranking(year)
        if universities:
            plt.figure()
            plt.barh(universities[:top_n][::-1], ranks[:top_n][::-1], color='skyblue')
            plt.xlabel('Ranking')
            plt.title(f'Top {top_n} Universities in China ({year})')
            plt.gca().invert_yaxis()
            plt.show()

# 查询功能
# 查询功能
def query_ranking():
    year = input("请输入年份(2015-2019):")
    university = input("请输入大学名称:")

    if year not in ['2015', '2016', '2017', '2018', '2019']:
        print("年份输入有误,请重新输入!")
        query_ranking()
        return

    universities, ranks = scrape_university_ranking(year)

    if universities:
        if university in universities:
            idx = universities.index(university)
            print(f"{university}在{year}年的排名是第{ranks[idx]}名")
        else:
            print(f"抱歉,{year}年的数据中不包含{university}的排名信息")
    else:
        print(f"抱歉,无法获取{year}年的大学排名数据")


# 按照排名输出前10位大学信息
years = ['2015', '2016', '2017', '2018', '2019']
for year in years:
    universities, ranks = scrape_university_ranking(year)
    print(f"\n{year}年中国最好大学排名前10位:")
    for u, r in zip(universities[:10], ranks[:10]):
        print(f"{r}. {u}")

# 可视化展示
plot_ranking(years)

# 查询功能
query_ranking()

 

posted @ 2024-05-21 23:55  The-rich  阅读(25)  评论(0)    收藏  举报