前言

实属无奈,爬虫技术有限,要爬取中国大学的全量数据,只能采取这种“所见即所得”的方式了。
但是其实可以不用那么死板哈,换一种思路,中国大学排名不一定需要这个网站爬呀,哈哈哈,可以换一个简单一点的,反爬机制没这么厉害的网站去爬哈。我这里纯属本着学习态度去玩的。

一、解释

首先解释一些selenium吧,或许一些小白不是很清楚。本质上selenium是python中的一个包,主要的作用是用来做自动化测试的,比如,某些新开发的网站,需要做一些点击测试,登录测试等啥的(解释不专业轻喷),就用selenium这个包去模拟人去执行“打开浏览器”>“登录网站”>“点击网站信息”等一系列操作的。简单来说,模拟人类点击登录网站等一系列操作的,关键词是模拟人类操作哈,其实跟按键精灵有点类似,不过感觉比按键精灵灵活。

二、准备

1、首先得安装selenium包哈,这个自行安装吧,这里不赘述了。然后是最关键的配置浏览器啦:

2、下载你谷歌浏览器(我这里只讲谷歌浏览器的哈,其他火狐、IE也是有的哈)对应版本的chromedriver;

chromedriver 你可以理解成一个你控制的驱动器,在鞭策驱使你电脑安装的谷歌浏览器打开哈哈哈,下载地址:传送门
请记得你的下载地址哈。
比如我的谷歌浏览器版本(好讨厌自动升级哦。。。):

然后我下载的chromedriver版本:

上面的解释一下哈,linux对应的linux电脑操作系统,mac对应是苹果电脑,m1应该是cpu吧,需要注意的是win32,不管是32位还是64位的win操作系统都用win32哈。

三、开始

直接上代码吧,边看边说

from selenium import webdriver # 导入selenium库中的webdriver
driver_path = r'D:\个人资料\python\python_CSDN\python中国大学排名爬取\plus\chromedriver.exe'  # 这里是你下载的chromedriver的地址哈
driver = webdriver.Chrome(driver_path)
driver.get('https://baidu') # 这个是测试用的。

如果弹出:

说明安装好啦。
直接更换成目标网址:

from selenium import webdriver # 导入selenium库中的webdriver
driver_path = r'D:\个人资料\python\python_CSDN\python中国大学排名爬取\plus\chromedriver.exe'
driver = webdriver.Chrome(driver_path)
driver.get('https://www.shanghairanking/rankings/bcur/202211') 

接下来就是很简单粗暴的爬取逻辑了:用selenium定位页面内的所有大学信息,并存储,然后点击下一页,继续爬取,直到最后一页爬完,就这样粗暴。
直接上代码吧,因为也是比较简单直接的逻辑:

代码如下:

# 大学排名全量爬取
# 借用selenium

from selenium import webdriver
import xlwt
import time

driver_path = r'D:\个人资料\python\python_CSDN\python中国大学排名爬取\plus\chromedriver.exe'
driver = webdriver.Chrome(driver_path)
driver.get('https://www.shanghairanking/rankings/bcur/202211')
time.sleep(2)
pages = 20 # 页码总数
univername = [] # 用来存储大学名称数据
univerprov = [] # 大学省份
univerclass = [] # 大学类别
universum = [] # 大学总分
univerlevel = [] # 办学层次
while 1:
    # 定位所有大学名称
    collegenames = driver.find_elements_by_xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[2]/div/div[2]/div[1]/div/div/a')
    # 定位大学省份
    collegeprov = driver.find_elements_by_xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[3]')
    # 定位大学类别
    collegeclass = driver.find_elements_by_xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[4]')
    # 定位大学总分
    collegesum = driver.find_elements_by_xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[5]')
    # 定位大学层次
    collegelevel = driver.find_elements_by_xpath('//*[@id="content-box"]/div[2]/table/tbody/tr/td[6]')
    # 获取每一页的循环次数
    n = len(collegenames)
    for each in range(n):
        univername.append(collegenames[each].text)
        univerprov.append(collegeprov[each].text)
        univerclass.append(collegeclass[each].text)
        universum.append(collegesum[each].text)
        univerlevel.append(collegelevel[each].text)
    # 让浏览器缓冲一下5秒
    time.sleep(5)
    pages -= 1
    if pages == 0:
        break
    # 点击下一页,点击下一页一定要放在判断后面哈,因为到最后一页的时候不需要再点击下一页了。不知道会出啥错误。
    driver.find_element_by_xpath('//*[@class="ant-pagination-item-link"]/i[@class="anticon anticon-right"]').click() # 带括号。。。大哭

# 存储为excel
wb = xlwt.Workbook()
sheet = wb.add_sheet('2022年所有大学排名')
# 设置表头
title = ['排名','大学名称','所属省份','类别','总分','办学层次']
d = [sheet.write(0,n,title[n]) for n in range(len(title))] # 'd'这个变量没啥用的,也可以不要d
# 写入内容
for num in range(len(univername)):
    sheet.write(num+1,0,num+1)
    sheet.write(num+1,1,univername[num])
    sheet.write(num+1,2,univerprov[num])
    sheet.write(num+1,3,univerclass[num])
    sheet.write(num+1,4,universum[num])
    sheet.write(num+1,5,univerlevel[num])

wb.save('D://桌面//2022univerranks.xls') # 改为自己的存储路径
print('-------------OVER-------------')
# 关闭浏览器
driver.quit()

三、结果

四、总结和建议

1、老实说,爬虫选择selenium对于我来说挺无奈的,没办法,高级爬虫还没学多少呢,所以如果数据量太大的爬虫,就不建议用selenium,因为效率真心不高,还有可能报一堆错误,如果都已经点到后面出错,那就更糟心了;
2、这个练习可以作为练习selenium练习;
3、推荐一个selenium入门课程,白月黑羽,我的selenium入门也是这个课程入门的,免费的哈。

更多推荐

selenium爬取全量中国大学排名情况《python网络爬虫与信息提取》