当前位置: 首页 > news >正文

基于BeautifulSoup库的简易爬虫实现:以大学排名为例

一、实验目的

  1. 掌握使用Python编写网络爬虫的基本方法;

  2. 学习使用requests、BeautifulSoup和lxml等库进行网页数据抓取与解析;

  3. 实现对"软科中国"网站大学排名数据的自动化采集;

  4. 将采集的数据保存为CSV格式文件,便于后续分析使用;

  5. 以广东财经大学为例,查找特定大学的历年排名变化。

二、实验环境

  • 操作系统:Windows

  • 编程语言:Python 3.x

  • 使用库:urllib, requests, time, csv, BeautifulSoup, lxml

三、实验内容与步骤

1. 网页请求模块

        创建connect()函数,设置请求头模拟浏览器访问,处理可能出现的HTTP和URL错误,确保网络请求的稳定性。

def connect(url): #获取urltry:headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0'}  html = requests.get(url,headers=headers) html.encoding = "UTF-8"except HTTPError as e:print(e)except URLError as e:print('The server could not be found!')return html

2. 主爬虫函数

设计mainparse()函数,用于获取世界大学排名和中国大学排名数据:

  • 使用BeautifulSoup解析HTML内容

  • 定位并提取表格中的排名数据

  • 每所大学对应6个数据字段

  • 添加换行符便于后续数据处理

    def mainparse(url,year,classification):#主爬虫(获取世界大学排名与中国大学排名)text = []html = connect(url)bs = BeautifulSoup(html.text,'html.parser')links = bs.find_all('tr')for link in links:l = link.find_all('td')#爬取标签‘tr’下所有‘td’标签for i in l:text.append(i.get_text(strip=True, separator=' '))#print(i.get_text(strip=True, separator=' '))if(len(text)%6==0):x = text.pop()text.append(x+'\n')#每个大学对应6个数据,添加换行符,以便后续数据处理saveinfo(text,year,classification)time.sleep(5)

3. 特定院校数据获取

实现GCparse()函数,专门抓取广东财经大学的历年排名数据:

  • 使用XPath定位特定元素

  • 提取排名和对应年份信息

    def GCparse():#通过xpath函数爬取广财历年排名html = connect("https://www.shanghairanking.cn/institution/guangdong-university-of-finance-and-economics")selector = etree.HTML(html.text)rankingchangel = selector.xpath("//div[@class='bcur-hist']/div[@class='item-rank']/div[@class='rank']/text()")rankingchangey = selector.xpath("//div[@class='bcur-hist']/div[@class='item-rank']/div[@class='year']/text()")saveinfoGC(rankingchangel,rankingchangey)#print(rankingchangel)#print(rankingchangey)

4. 数据存储功能

创建两种数据保存函数:

  • saveinfoGC():保存广东财经大学的排名数据

  • saveinfo():保存世界和中国大学排名数据,根据不同类型设置不同的表头

    def saveinfoGC(info1,info2):#保存数据csvFile = open('gctext.csv','w+',encoding='utf-8',newline='')we = csv.writer(csvFile)we.writerow(('广财在财经类院校近5年排名:'))we.writerow('\n')we.writerow(info1)we.writerow('\n')we.writerow(info2)csvFile.close()def saveinfo(info,year,classification):#保存数据year = str(year)if classification == 'arwu/':csvFile = open(year+'世界大学排名.csv','w+',encoding='utf-8',newline='')we = csv.writer(csvFile)we.writerow(('排名','学校','所属国家','国家内排名','总分','校友获奖'))else:csvFile = open(year+'中国大学排名.csv','w+',encoding='utf-8',newline='')we = csv.writer(csvFile)we.writerow(('排名','学校','所属省市','类别','总分'))we.writerow('\n')we.writerow(info)csvFile.close()

5. 主程序流程

main()函数中:

  • 设置基础URL和分类参数

  • 使用循环遍历2016-2021年的排名数据

  • 依次调用各爬虫函数获取数据

  • 最后获取广东财经大学的特殊排名数据

    def main():#主函数输入相关参数并启动爬虫url = "https://www.shanghairanking.cn/rankings/"classification = ['arwu/','bcur/']#前者对应世界排名,后者对应国内排名for x in classification:startyear = 2016for i in range(6):#for循环遍历2016-2021年的排名sy = str(startyear)mainparse(url+x+sy,startyear,x)  startyear = startyear + 1GCparse()
    main()

四、实验结果

程序成功运行后,生成以下数据文件:

  1. 2016-2021年世界大学排名CSV文件(6个)

  2. 2016-2021年中国大学排名CSV文件(6个)

  3. 广东财经大学近5年排名数据CSV文件(1个)

每个CSV文件都包含完整的排名数据,结构清晰,便于后续数据分析使用。

示例(2016年世界大学排名(部分)):

五、实验分析

 技术亮点:

  • 使用面向对象的编程思想,将功能模块化

  • 采用异常处理机制,增强程序稳定性

  • 结合BeautifulSoup和lxml两种解析方式,发挥各自优势

  • 设置合理的请求间隔,避免对目标网站造成过大压力

六、实验总结

        本实验成功实现了对软科中国网站大学排名数据的自动化采集,掌握了网络爬虫的基本原理和实现方法。通过本次实验,加深了对HTML解析、数据提取和存储的理解,提高了Python编程能力和实际问题解决能力。特别是针对特定院校(广东财经大学)的排名变化分析,体现了数据采集的针对性和实用性。

        可改进之处:

        可增加数据去重和清洗功能;

        可添加进度显示功能,方便监控爬取过程;

        可考虑使用数据库存储替代CSV文件;

        可增加异常重试机制,提高数据完整性。

http://www.dtcms.com/a/356911.html

相关文章:

  • 【K8s】整体认识K8s之与集群外部访问--service
  • 机器学习回顾——逻辑回归
  • pcl封装6 connection_cloud 提取聚簇后的每个点云
  • 开源vs商用美颜sdk:美白滤镜功能在直播中的优劣对比
  • RoadMP3告别车载音乐烦恼,一键get兼容音频
  • FDTD_mie散射_项目研究(1)
  • 抖音电商首创最严珠宝玉石质检体系,推动行业规范与消费扩容
  • Shader开发(十八)实现纹理滚动效果
  • Shell 脚本基础教程
  • AARRR模型(用户生命周期模型)——用户怎么长大的?
  • 【人工智能99问】GPT4的原理是什么?(32/99)
  • 【备战2025数模国赛】(三)数模常见赛题类型及解决办法
  • 矩池云中LLaMA- Factory多机多卡训练
  • 介绍⼀下Llama的结构
  • 身份证实名认证API集成—身份核验接口-网络平台安全合规
  • GoogLeNet:深度学习中的“卷积网络变形金刚“
  • 安全月报 | 傲盾DDoS攻击防御2025年8月简报
  • 贷款审批太慢,如何快速完成财务报表识别录入?
  • 第十三章项目资源管理--13.8 控制资源
  • 关于人工智能模型应用于编程学习我也说两句
  • 2025 IBMS智能化集成系统全面解析指导手册
  • 8月29日星期五今日早报简报微语报早读
  • 创维E910V10C_海思MV100芯片_优盘强刷卡刷固件包
  • 基于脚手架微服务的视频点播系统界面布局部分(一):首页及播放界面布局
  • 【基于hyperledger fabric的教育证书管理系统】
  • redux toolkit (RTK)
  • 蓝牙配对鉴权过程深度剖析:Just Works/Numeric Comparison/Passkey Entry/OOB 协议流程
  • KNN算法详解:从原理到实战(鸢尾花分类 手写数字识别)
  • node.js 安装步骤
  • Python教学:6. 循环