项目背景
随着教育信息化的发展,各大高校的排名成为学生和家长选择学校的重要参考依据。上海软科发布的《中国最好大学排名》(Best Chinese Universities Ranking)是国内外广泛认可的权威排名之一。本项目旨在通过网络爬虫技术,从上海软科官方网站上爬取2024年中国大学排名的数据,并进行简单的数据处理和分析,最终将结果保存为Excel文件,以便于进一步研究和使用。
项目目标
- 数据获取:使用 requests 库发送HTTP请求,获取上海软科2024年中国大学排名的网页内容。
- 数据解析:利用 BeautifulSoup 库解析HTML文档,提取排名、学校名称和总分等关键信息。
- 数据处理:将提取的数据存储在列表中,并使用 pandas 库创建DataFrame对象,便于后续的数据处理和分析。
- 数据输出:将处理后的数据保存为Excel文件,方便用户查看和使用。
技术栈
- Python:编程语言
- requests:用于发送HTTP请求,获取网页内容
- BeautifulSoup:用于解析HTML和XML文档
- pandas:用于数据处理和分析
- Excel:数据存储格式
主要功能
- getHTMLText:发送HTTP请求,获取指定URL的网页内容。
- fillUnivList:解析HTML文档,提取排名、学校名称和总分等信息,并将其存储在列表中。
- printUnivList:打印前N条排名数据,方便用户查看。
- saveToExcel:将提取的数据保存为Excel/CSV文件。
项目结构
# 导入模块
# requests:用于发送HTTP请求,获取网页内容
import requests
# BeautifulSoup:用于解析HTML和XML文档
from bs4 import BeautifulSoup
# bs4:用于处理HTML和XML文档,BeautifulSoup的别名,方便使用
import bs4
# pandas:用于数据处理和数据分析
import pandas as pd
# 定义getHTMLText函数
def getHTMLText(url):
# try...except:用于捕获并处理请求过程中可能出现的异常
try:
# 发送GET请求,获取网页内容,设置超时时间为30秒
r = requests.get(url,timeout=30)
# 如果请求失败(HTTP状态码不是200),抛出异常
r.raise_for_status()
# 设置响应内容编码,确保正确解码
r.encoding = r.apparent_encoding
# 返回网页内容
return r.text
# except Exception as e:捕获所有异常,并打印错误信息,返回空字符串
except Exception as e:
print(f"Error fetching {url}:{e}")
return ""
# 定义fillUnivList函数
def fillUnivList(ulist,html):
# 创建BeautifulSoup对象,解析HTML文档
soup = BeautifulSoup(html,"html.parser")
# 查找<tbody>标签
tbody = soup.find('tbody')
# 如果没有<tbody>标签,打印提示信息并返回
if tbody is None:
print("No <tbody> found in the page.没有发现<tbody>标签。")
return
# 遍历所有<tr>标签
for tr in tbody.find_all('tr'):
# 检查是否为标签对象
if isinstance(tr,bs4.element.Tag):
# 查找<tr>标签中所有<td>标签
tds = tr.find_all('td')
# 确保有足够的<td>标签
if len(tds) >= 6:
# 提取第一个<td>标签中的排名数据,并去除前后空白
# .strip():用于去除字符串前后空白(包括空格、制表符、换行符等)
rank = tds[0].string.strip() if tds[0].string else ''
# 查找第二个<td>标签中的<span>标签
name_span = tds[1].find('span')
# 提取<span>标签中的学校名称数据,并去除前后空白
name = name_span.string.strip() if name_span else ''
# 提取第五个<td>标签中的总分数据,并去除前后空白
# 假设总分是在第五个<td>标签中的值
score = tds[4].string.strip() if tds[4].string else ''
# 将数据添加到ulist列表中
ulist.append([rank,name,score])
# 定义printUnivList函数
def printUnivList(ulist,num):
# 打印表头
"""
{:^10}\t{:^6}\t{:^10}:是一种结合了对齐方式和制表符的格式化方式;
: :分隔符,表示开始格式化;
^ :对齐方式,表示居中对齐;
10 :字段宽度,表示该字段占用10个字符的宽度;
"""
print("{:^10}\t{:^6}\t{:^10}".format("排名","学校名称","总分"))
# 遍历ulist列表的前num个元素
for i in range(min(num,len(ulist))):
# 获取当前行数据
u = ulist[i]
# 打印当前行数据
print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
# 打印成功打印的记录数
print("成功打印了" + str(min(num,len(ulist))) + "条记录")
# 定义saveToExcel函数/saveToCSV函数
def saveToExcel(ulist,filename):
# 创建DataFrame对象,并将ulist列表作为数据
df = pd.DataFrame(ulist,columns=["排名","学校名称","总分"])
# 保存DataFrame对象到Excel文件/CSV文件,需设置UTF-8编码以支持中文(encoding = 'utf-8')
df.to_excel(filename,index=False)
# 打印保存成功信息
print(f"数据已保存到{filename}")
# 定义主函数
def main():
# 创建ulist空列表,用于存储数据
ulist = []
# 设置目标URL
url = "https://www.shanghairanking.cn/rankings/bcur/2024"
# 调用getHTMLText函数获取网页内容
html = getHTMLText(url)
# 如果获取失败,打印错误信息并返回
if not html:
print("Failed to retrieve the webpage content.检索网页内容失败。")
return
# 调用fillUnivList函数,填充ulist列表
fillUnivList(ulist,html)
# 调用printUnivList函数,打印ulist列表的前30个元素
printUnivList(ulist,30)
# 定义保存路径,..._2024.xlsx/csv/txt
save_path = "D:/360/university_ranking_2024.xlsx"
# 调用saveToExcel函数/saveToCSV函数/saveToTXT函数,将ulist列表保存到Excel文件/CSV文件
saveToExcel(ulist,save_path)
# 调用主函数,执行程序
main()
使用说明
- 环境准备:确保已安装Python及其相关库(requests, beautifulsoup4, pandas)。
- 运行脚本:直接运行 main() 函数即可启动数据爬取和处理流程。
- 查看结果:爬取的数据将被保存到指定路径的CSV文件中,路径可以在 save_path 变量中进行配置。
作者注:本人自学Python爬虫的项目练习,分享一下,加油!