目标网页

我们对爬虫的使用,肯定是少不了网页的支持啦,这次我们对

2022世界大学学术排名https://www.shanghairanking.cn/rankings/arwu/2022
进行大学排名数据的爬取并且存储进excel,但是这次不细讲爬虫而是只讲selenium的简单使用,所以不对数据进行清洗降噪了

使用的库

首先你得安装bs4、selenium、pandas、time
你可能现在有疑问了,为什么要用pandas,我只能说简单数据简单处理
这些库自行安装不细讲
学python前你得要会pip

谷歌驱动程序的安装位置

下载谷歌驱动去网上找网址,位置我放在了

python 爬虫触发点击 python爬虫 点击下一页_selenium

下一页点击事件

主题来了,直接上代码,不过我们要有思路先才能写代码

python 爬虫触发点击 python爬虫 点击下一页_python 爬虫触发点击_02


我们现在准备对这几行数据进行爬取,并且要爬取在排行榜上的所有高校

我们在此就先查看一下他的源码

python 爬虫触发点击 python爬虫 点击下一页_selenium_03


我们了解了这些数据全在"tbody"下面,这就好办了

我们把这一页的数据爬取下来先放进一个数组里面先

但是做这些还必须先启动谷歌才行

启动谷歌程序

from bs4 import BeautifulSoupfrom selenium import webdriver
import pandas as pd
import bs4
import time

option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)  # option是让谷歌一直开着,而不是只打开一下子就关掉
url = "https://www.shanghairanking.cn/rankings/arwu/2022" # 定义好链接
browser = webdriver.Chrome(options=option)  # 启动谷歌浏览器
browser.get(url)  #连接

python 爬虫触发点击 python爬虫 点击下一页_selenium_04

ulist = [] # 先创建一个数组

检索数据取出放进数组里面def getData():
	html = browser.page_source	#获取全部网页信息
	soup = BeautifulSoup(html, "html.parser")
	for tr in soup.find('tbody').children:  # 找到tbody的子节点
		if isinstance(tr, bs4.element.Tag):  # 判断tr是否属于子节点中
			tds = tr('td')
			ulist.append([tds[0].text.strip(), tds[1].text.strip(), tds[2].text.strip(), tds[3].text.strip(),tds[4].text.strip()]) # 获取文本,清空空格

目前获取的也只是一页的数据,我们要获取全部数据

python 爬虫触发点击 python爬虫 点击下一页_python_05


这里有34页,我们想要全部数据就必须要让页面进行跳转,让他自动跳转后获取当前页面我们想要的所有数据,再次查看源代码

python 爬虫触发点击 python爬虫 点击下一页_学习方法_06


这里没有链接,那就是说这个就是一个选项卡,那下面的代码就简单了

先定义页数 flag=1

while flag <= 34:  # 循环页数	getData()   #每次循环都要调用一次定义的函数	time.sleep(5)	#让每个页面都停留五秒再进行点击跳转,让getData函数把数据全爬取完
	next_page = browser.find_element_by_css_selector('li.ant-pagination-next>a') 	#selenium的类选择器,找到a标签然后点击跳转
	next_page.click()  # 点击下一页,selenium内置的点击事件
	flag += 1  #循环完加一

数据存储处理

老规矩,定义函数

def dataFarm(unfo):   school = ["排名", "学校名称", "国家/地区", "国家/地区排名", "总分"]   chckout = pd.DataFrame(unfo, columns=school)
   chckout.to_excel("D:/desktop/大学排名数据.xlsx", index=False)
   print("爬取成功!")
都不用try except,因为数据简单,代码少,懒得搞了

总体的代码结尾处记得调用一下

dataFarm(ulist)