Python自动化小技巧22——获取中国高校排名数据

news2025/1/20 14:50:49

背景

【软科排名】2023年最新软科中国大学排名|中国最好大学排名 (shanghairanking.cn)

爬取这个网站所有的高校的数据,包括学习名称,层次,地区,分数等等信息:['办学层次','学科水平','办学资源','师资规模与结构','人才培养','科学研究','服务社会','高端人才','重大项目与成果','国际竞争力']

思路

动态网页,没办法用resquest获取网页文件然后bs解析,json接口也没得....只能js动态获取然后清洗,或者selenium库模拟点击。

我这里使用selenium库模拟点击,慢是慢了点,但是能用....

(这是我爬过最麻烦的网站,下面这三个按钮折腾了我好久....换了页就点击不了,一直说有什么遮挡住了,,我只能爬一个项目重启一次浏览器)


准备

模拟点击selenium库需要一个浏览器驱动程序,

这里用的是edge的驱动器,需要去官网下载:Microsoft Edge WebDriver - Microsoft Edge Developer

 然后把msedgedriver.exe文件和代码放在一个目录下就能运行了。


代码

导入包:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
    
from bs4 import BeautifulSoup
import os
import pandas as pd
from time import sleep

爬虫代码:

url = "https://www.shanghairanking.cn/rankings/bcur/2023"
df_all=pd.DataFrame()

options=['办学层次','学科水平','办学资源','师资规模与结构','人才培养','科学研究','服务社会','高端人才','重大项目与成果','国际竞争力']

for i in range(len(options)):
    research_name=options[i]
    print(research_name) 
    
    #启动浏览器
    driver = webdriver.Edge("msedgedriver")
    driver.implicitly_wait(2)
    driver.get(url)
    sleep(2)  
    
    #点击选项
    bu=driver.find_element(By.XPATH, '//*[@id="content-box"]/div[2]/table/thead/tr/th[6]/div/div[1]/div[1]')
    bu.click()
    fund = driver.find_element(By.XPATH,f'//*[@id="content-box"]/div[2]/table/thead/tr/th[6]/div/div[1]/div[2]/ul/li[{i+1}]')
    fund.click() 
    df_oneresearch=pd.DataFrame()
    
    #遍历20面
    for page in range(20):
        # 定位到表格元素
        table = driver.find_element(By.XPATH, '//*[@id="content-box"]/div[2]/table/tbody')
        data_list = []
        rows = table.find_elements(By.TAG_NAME, "tr")[:]
        for row in rows:
            
            cells = row.find_elements(By.TAG_NAME, "td")
            rank = cells[0].text.strip()
            university_name = cells[1].find_element(By.CLASS_NAME, "name-cn").text.strip()
            english_name = cells[1].find_element(By.CLASS_NAME, "name-en").text.strip()
            tags = ""
            #tages = cells[1].find_element(By.CLASS_NAME, "tags").text.strip()
            try:
                tags = cells[1].find_element(By.CLASS_NAME, "tags").text.strip()
            except Exception as e:
                pass
                #print(f'{university_name}报错了')
            location = cells[2].text.strip()
            category = cells[3].text.strip()
            score = cells[4].text.strip()
            research = cells[5].text.strip()
            data_dict = {"排名": rank,"中文名)": university_name,"英文名": english_name,"层次标签" : tags, "省市": 
                         location,"类型": category,"总分": score,research_name: research}
            data_list.append(data_dict)
            df_one=pd.DataFrame(data_list)
        df_oneresearch=pd.concat([df_oneresearch,df_one],axis=0,ignore_index=True)
            
        print(f'{page+1}页爬取完成')
        # 定位到下一页的元素
        next_page_element = driver.find_element(By.CLASS_NAME, "ant-pagination-next")
        next_page_element.click()
    
    for col in df_oneresearch.columns:
        df_all[col]=df_oneresearch[col]
        
    print('2s后关掉浏览器开始下一个')
    sleep(2) 
    driver.quit()

查看:

df_all.head()

当然获得的数据用下面储存就行了:
 

df_all.to_excel('高校数据.xlsx',index=False)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/966815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红日靶场五(vulnstack5)渗透分析

环境搭建 win7 192.168.111.132(仅主机) 192.168.123.212(桥接) .\heart p-0p-0p-0win2008 ip: 192.168.111.131(仅主机) sun\admin 2020.comkali ip: 192.168.10.131(nat)vps&…

字节一面:说说地址栏输入 URL 敲下回车后发生了什么?

前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,作为一名前端开发工程师,我们只有了解地址栏输入 URL 敲下回车后发生的事件,才知道性能优化如何下手,性能优化也是前端必备知识&#xf…

第一章_线程基础知识

先拜拜大神 Doug Lea(道格.利) java.util.concurrent在并发编程中使用的工具包 为什么学习并用好多线程极其重要 硬件方面 摩尔定律失效 摩尔定律:它是由英特尔创始人之一Gordon Moore(戈登.摩尔)提出来的。其内容为…

Centos 6.5 升级到Centos7指导手册

一、背景 某业务系统因建设较早,使用的OS比较过时,还是centos6.5的系统,因国产化需要,需将该系统升级到BClinux 8.6,但官方显示不支持centos 6.x升级到8,需先将centos6.5升级到centos7的最新版&#xff0c…

Python之作业(一)

Python之作业(一) 作业 打印九九乘法表 用户登录验证 用户依次输入用户名和密码,然后提交验证用户不存在、密码错误,都显示用户名或密码错误提示错误3次,则退出程序验证成功则显示登录信息 九九乘法表 代码分析 先…

【100天精通Python】Day52:Python 数据分析_Numpy入门基础与数组操作

目录 1 NumPy 基础概述 1.1 NumPy的主要特点和功能 1.2 NumPy 安装和导入 2 Numpy 数组 2.1 创建NumPy数组 2.2 数组的形状和维度 2.3 数组的数据类型 2.4 访问和修改数组元素 3 数组操作 3.1 数组运算 3.2 数学函数 3.3 统计函数 4 数组形状操作 4.1 重塑数组形…

Sentinel 流量控制框架

1. Sentinel 是什么? Sentinel是由阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件。 2. 主要优势和特性 轻量级,核心库无多余依赖,性能损耗小。 方便接入,开源生态广泛。 丰富的流量控制场景。 …

【C#】泛型

【C#】泛型 泛型是什么 泛型是将类型作为参数传递给类、结构、接口和方法,这些参数相当于类型占位符。当我们定义类或方法时使用占位符代替变量类型,真正使用时再具体指定数据类型,以此来达到代码重用目的。 泛型特点 提高代码重用性一定…

ThreadLocal源码剖析(简单理解)

Thread部分源码 public class Thread implements Runnable {ThreadLocal.ThreadLocalMap threadLocals null; }ThreadLocal源码,其中ThreadLocal有一个静态内部类ThreadLocalMap,这个Map不是类似二叉树类型的,只是一个普通数组,其中具体使用什么算法其实我也不太理解. 然后对…

【LeetCode】剑指 Offer <二刷>(5)

目录 题目:剑指 Offer 10- II. 青蛙跳台阶问题 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 11. 旋转数组的最小数字 - 力…

MIPI D-PHY的初始化(MIPI Alliance Xilinx)

DPHY的基本介绍及使用已有很多文章,基本是基于《MIPI Alliance Specification for D-PHY 》的内容,学习时也以此为准,可参考CSDN上的文章。着重讲述MIPI D-PHY的初始化部分 1 D-PHY的功能及使用 下面的文章讲的不错,既有理论&…

内存管理方式

内存管理 一、C/C内存分布1、内存空间的介绍2、示例题目3、示例题目图解 二、C语言动态内存管理方式1、代码2、介绍 三、C内存管理方式1、概念2、代码3、代码所代表的意义 四、new和delete操作自定义类型1、代码2、运行结果3、特点 五、operator new与operator delete函数1、概…

【算法系列篇】模拟算法

文章目录 前言1.替换所有问号1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 提莫攻击2.1 题目要求2.2 做题思路2.3 Java代码实现 3. N 字形变换3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 外观数列4.1 题目要求4.2 做题思路4.3 Java代码实现 5. 数青蛙5.1 题目要求5.2 做题思…

CXL.mem S2M Message 释义

🔥点击查看精选 CXL 系列文章🔥 🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥 📢 声明: 🥭 作者主页:【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

【操作系统】一文快速入门,很适合JAVA后端看

作者简介: 目录 1.概述 2.CPU管理 3.内存管理 4.IO管理 1.概述 操作系统可以看作一个计算机的管理系统,对计算机的硬件资源提供了一套完整的管理解决方案。计算机的硬件组成有五大模块:运算器、控制器、存储器、输入设备、输出设备。操作…

使用candump+grep查看CAN报文

在Linux系统中观察看CAN报文,我们一般使用candump,但是有时候会发现总线上CAN报文太多,例如开启了好几个PDO,这就导致想看的报文被夹杂到报文的海洋里,然后再去找,非常麻烦。 candump也提供了只观察某个报…

LeetCode 无重复字符的最长子串 打败100%的人

😀前言 LeetCode上的“无重复字符的最长子串”问题要求我们找到给定字符串中不包含重复字符的最长子串的长度。这个问题是一个典型的滑动窗口技巧的应用,需要有效地处理字符出现的情况来找到解决方案。 . 在本解决方案中,我们将探讨两种不同的…

EMC VNX2代一键关机方法

由于不正确的EMC VNX存储系统的关机导致客户业务中断,数据丢失的案例数不胜数。不正确的关机顺序,很容易造成内存中的数据丢失,进而导致dirty cache,然后系统的LUN和POOL就无法online,业务中断。本文仅仅对EMC 2代产品…

Vue——vue3+element plus实现多选表格使用ajax发送id数组

代码来源: Vue 3结合element plus(问题总结二)之 table组件实现多选和清除选中(在vue3中获取ref 的Dom)_multipletableref.value.togglerowselection()打印出来的是u_子时不睡的博客-CSDN博客 前言 为了实现批量删除功能的功能…

linux编程第一部分总结

C多线程安全原则 对象析构很复杂&#xff0c;我们采用shared_ptr和weak_ptr来做 enable_shared_from_this<>是用来做回调的&#xff0c;因为多线程中可能对象的生命周期比传出去的this指针短&#xff0c;同时为了不延长对象的生命周期&#xff0c;我们把shared_ptr转成we…