基于BeautifulSoup库的简易爬虫实现:以大学排名为例
一、实验目的
掌握使用Python编写网络爬虫的基本方法;
学习使用requests、BeautifulSoup和lxml等库进行网页数据抓取与解析;
实现对"软科中国"网站大学排名数据的自动化采集;
将采集的数据保存为CSV格式文件,便于后续分析使用;
以广东财经大学为例,查找特定大学的历年排名变化。
二、实验环境
操作系统: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()
四、实验结果
程序成功运行后,生成以下数据文件:
2016-2021年世界大学排名CSV文件(6个)
2016-2021年中国大学排名CSV文件(6个)
广东财经大学近5年排名数据CSV文件(1个)
每个CSV文件都包含完整的排名数据,结构清晰,便于后续数据分析使用。
示例(2016年世界大学排名(部分)):
五、实验分析
技术亮点:
使用面向对象的编程思想,将功能模块化
采用异常处理机制,增强程序稳定性
结合BeautifulSoup和lxml两种解析方式,发挥各自优势
设置合理的请求间隔,避免对目标网站造成过大压力
六、实验总结
本实验成功实现了对软科中国网站大学排名数据的自动化采集,掌握了网络爬虫的基本原理和实现方法。通过本次实验,加深了对HTML解析、数据提取和存储的理解,提高了Python编程能力和实际问题解决能力。特别是针对特定院校(广东财经大学)的排名变化分析,体现了数据采集的针对性和实用性。
可改进之处:
可增加数据去重和清洗功能;
可添加进度显示功能,方便监控爬取过程;
可考虑使用数据库存储替代CSV文件;
可增加异常重试机制,提高数据完整性。