本文旨在利用Python中的Selenium、BeautifulSoup库爬取软科2024中国大学排行榜主榜名单,方便后续分析。
相关库简介
Selenium 是一个用于 Web 应用程序测试的强大工具,可以直接在浏览器中操作和执行测试。它支持多种编程语言(如 Python、Java、C#、Ruby 等)和各种主流浏览器(如 Chrome、Firefox、Safari 等),并能够与浏览器无缝集成进行自动化测试。
Selenium 主要组件
Selenium WebDriver:核心组件,用于与浏览器进行交互。通过 WebDriver,可以控制浏览器的行为,如打开网页、点击按钮、输入文本等。
Selenium Grid:用于分布式测试,可以并行运行测试用例,从而加快测试速度。
Selenium IDE:一种用于快速创建测试脚本的浏览器插件,支持录制和回放功能。
为什么要使用Selenium 库?
观察软科的大学排行榜,进行翻页操作的时候,url是没有发生变化。那么以往使用 requests 和 BeautifulSoup根据pages信息的变化进行分页抓取操作就不再使用,只能引入Selenium框架,通过模拟鼠标的操作,实现翻页。
BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库。它创建一个解析树,用于以 Python 友好的方式提取数据。BeautifulSoup 特别适用于处理不规范的 HTML 标记,并能方便地从中提取所需的信息。
安装Selenium、BeautifulSoup库
pip install Selenium
pip install BeautifulSoup
代码实现
导入相关库
# -*- coding: UTF-8 -*-# 导入相关库import csv
from bs4 import BeautifulSoup
import bs4
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains # 鼠标操作from selenium.webdriver.common.by import By
import time
解析 HTML 文档
定义get_info 函数,用于从网页内容中提取特定信息。
# 获取信息函数defget_info(soup, _type, element, param=None):if _type =="find":if param isnotNone:
params =dict([param.split('=')])
res = soup.find(element,**params)else:
res = soup.find(element)if res isnotNone:
res = res.string.replace(" ","").replace("\n","")else:
res ="None"if _type =="find_all":if param isnotNone:
params =dict([param.split('=')])
res = soup.find_all(element,**params)else:
res = soup.find_all(element)return res
提取排行榜中的高校信息
定义 fillUnivList函数, 用于从 HTML 中提取高校的信息,并将提取到的信息填充到列表。
# 填充大学列表函数deffillUnivList(html, ulist):
soup = BeautifulSoup(html,'html.parser')for tr in soup.find('tbody').children:ifisinstance(tr, bs4.element.Tag):# 如果为Tag类型
td_list = tr.find_all('td')"排名"
top = get_info(td_list[0],"find","div","class_=ranking")"logo"
logo = td_list[1].find('img')["src"]"中文名/英文名"
university_list = get_info(td_list[1],"find_all","a")
ch_name = university_list[0].string.replace("\n","").replace("\t","").strip(" ")
en_name = university_list[1].string.replace("\n","").strip(" ")"学校标签"
tags = get_info(td_list[1],"find","p")"学校地址"
area = td_list[2].text.replace("\n","").strip(" ")"学校行业"
main = td_list[3].text.replace("\n","").strip(" ")"综合分数"
score = td_list[4].text.replace("\n","").strip(" ")"办学层次"
layer = td_list[5].text.replace("\n","").strip(" ")# 添加到列表
ulist.append([top, ch_name, en_name, tags, area, main, score, layer, logo])
将提取的信息保存为CSV文件
# 保存到CSV函数defsaveToCSV(ulist, filename):
headers =['排名','中文名','英文名','标签','地址','行业','分数','层次','Logo']withopen(filename,'w', newline='', encoding='utf-8-sig')as f:
writer = csv.writer(f)
writer.writerow(headers)
writer.writerows(ulist)
模拟鼠标操作进行翻页
# 鼠标操作运行函数defaction_run(driver, actions, info, by=By.ID, time_num=1):while1:
config_facesearch = driver.find_element(by=by, value=info)if config_facesearch.is_displayed():
actions.move_to_element(config_facesearch).click().perform()
time.sleep(time_num)breakelse:print("%s is not find, waiting..."%(info))
time.sleep(1)
主函数
根据爬取页面进行设置浏览器(如 Chrome、Firefox、Safari 等)、循环次数等信息。
# 主函数if __name__ =="__main__":
url ="https://www.shanghairanking.cn/rankings/bcur/2024"
start = time.strftime("%H:%M:%S", time.localtime())
driver = webdriver.Firefox()# driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)
time.sleep(2)"模拟鼠标操作"
actions = ActionChains(driver)
ulist =[]for i inrange(20):
html = driver.page_source
fillUnivList(html, ulist)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 滚动至底部
action_run(driver, actions, info="li[title='下一页']", by=By.CSS_SELECTOR)
end = time.strftime("%H:%M:%S", time.localtime())print("用时%s - %s"%(start, end))# 时长统计# 关闭浏览器
driver.quit()# 保存为CSV文件
saveToCSV(ulist,'university_rankings.csv')
可能会遇到的问题
运行过程中会发生以下报错,是对应浏览器的驱动没有安装。可以浏览 Selenium详解
进行参考解决。
结果展示
如下,软科2024中国高校主榜页面的相关信息都提取保存为csv文件了。大家可以通过修改url,获取软科其他的榜单,
推荐阅读
- 【可视化】用pyecharts绘制我国人口分布
- 【可视化】软科2024中国大学可视化分析
欢迎关注我的公众号“AI拾贝”,原创技术文章第一时间推送。后台发送”排行榜“,自动回复源码和数据。
版权归原作者 晨昏三变 所有, 如有侵权,请联系我们删除。