前言
实属无奈,爬虫技术有限,要爬取中国大学的全量数据,只能采取这种“所见即所得”的方式了。
但是其实可以不用那么死板哈,换一种思路,中国大学排名不一定需要这个网站爬呀,哈哈哈,可以换一个简单一点的,反爬机制没这么厉害的网站去爬哈。我这里纯属本着学习态度去玩的。
一、解释
首先解释一些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网络爬虫与信息提取》
发布评论