首页 > 编程语言 >Python实战:selenium模拟浏览器运行,获取软科网站2023中国大学排名

Python实战:selenium模拟浏览器运行,获取软科网站2023中国大学排名

时间:2024-01-20 20:36:36浏览次数:51  
标签:浏览器 Python text selenium rank 2023 排名 page

Python实战:selenium模拟浏览器运行,获取软科网站2023中国大学排名

在爬取一些加密的网页时,可以使用selenium模拟浏览器运行,再从网页中提取想要的数据。

使用的库

本文使用到的 Python 库有:selenium、bs4、pandas

使用selenium解决网页的反爬

使用bs4对html网页进行解析和提取数据

使用pandas对获取到的数据保存到excel表

目标网页

2023 中国大学排名:

https://www.shanghairanking.cn/rankings/bcur/2023

在爬取软科网站时,由于请求是加密的,不能简单使用 request 库直接爬取,换用 Selenium 库模拟真实用户去访问网页。

Selenium 是广泛使用的模拟浏览器运行的库,它是一个用于 Web 应用程序测试的工具。 Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。

使用 selenium 需要下载 chromedriver 驱动,放在 Python 安装的路径下。

可以去这个链接下载最新版本 chromedriver 驱动 https://googlechromelabs.github.io/chrome-for-testing/

爬取的字段

爬取“排名”、“学校名称”、“省市”、“类型”、“总分”、“办学层次”这 6 个字段。

启动谷歌浏览器

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd
import bs4

option = webdriver.ChromeOptions()
# option是让谷歌一直开着,而不是只打开一下子就关掉
option.add_experimental_option("detach", True)
# 定义url
url = "https://www.shanghairanking.cn/rankings/bcur/2023"
# 启动谷歌浏览器
browser = webdriver.Chrome(options=option)
# # 浏览器最大化
# browser.maximize_window()
# 访问url
browser.get(url)
# 隐式等待
browser.implicitly_wait(5)

提取数据

检索网页中的数据,这些数据都在“tbody”里面,取出来放进数组里面。

# 先创建一个数组,保存结果
contents = []
# 检索数据取出放进数组里面
def get_data():
    # 获取全部网页信息
    html = browser.page_source
    soup = BeautifulSoup(html, "html.parser")
    # 找到tbody的子节点
    for tr in soup.find('tbody').children:
        # 判断tr是否属于子节点中
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')
            # 获取文本,清除换行符,清空空格
            name = tr.find(class_="name-cn").text.replace('\n', '').strip()
            contents.append([tds[0].text.strip(), name, tds[2].text.strip(), tds[3].text.strip(),
                             tds[4].text.strip(), tds[5].text.strip()])
    print("总计获取到", len(contents), "个学校排名")

翻页爬取

排名的数据一共有 20 页,定位到翻页元素,使用click()点击事件,切换到下一页,再调用get_data()函数提取网页中的数据。

def get_all():
    page = 1
    while page <= 20:  # 循环页数
        # print("开始爬取第", page, "页")
        get_data(page)  # 每次循环都要调用一次获取数据的函数
        next_page = browser.find_element(By.CSS_SELECTOR, 'li.ant-pagination-next>a')
        next_page.click()  # 点击下一页,selenium内置的点击事件
        page += 1  # 循环完加一

保存到excel表

使用 pandas 将列表中的数据转为 DataFram 类型,对"排名"、"总分"、"办学层次"3 字段处理,这 3 个字段数据类型是 str 字符串类型,将字符串类型转为 int 和 float 数据类型,再保存到 excel 表中。

由于"办学层次"字段有空值,需要使用pd.to_numeric函数,将 errors 参数设为coerce,可以将无效解析设置为NaN

errors 有 3 种类型{‘ignore’, ‘raise’, ‘coerce’},默认为raise,这里选择使用corece,将无效解析设置为NaN

raise参数:无效的解析将引发异常

corece参数:将无效解析设置为 NaN

ignore参数:**无效的解析将返回输入

def save_data(data):
    first_name = ["排名", "学校名称", "省市", "类型", "总分", "办学层次"]
    rank = pd.DataFrame(data, columns=first_name)
    # 将字符串转为int或float类型
    rank["排名"] = rank["排名"].astype(int)
    rank["总分"] = rank["总分"].astype(float)
    # pd.to_numeric函数errors参数设为'coerce',可以将无效解析设置为NaN
    rank["办学层次"] = rank["办学层次"].apply(pd.to_numeric, errors='coerce')
    print(rank.head())

    rank.to_excel("2023中国大学排名2.xlsx", index=False)
    print("保存成功!")

关闭浏览器

# 关闭浏览器
browser.quit()

保存的 excel 表如下,总共获取到 590 个学校排名:

更多排名

使用类似的方法,可以爬取软科网站的其他排名,有兴趣的可以自己试一试。

难点

本文使用 selenium 模拟浏览器运行,使用了翻页爬取,获取了软科网站 2023 中国大学排名,获取到 20 页网页 590 个学校的排名。爬取过程中的困难主要是使用 selenium 定位元素,需要多练习。

完整代码

整合代码,完美运行。完整代码如下:

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd
import bs4

option = webdriver.ChromeOptions()
# option是让谷歌一直开着,而不是只打开一下子就关掉
option.add_experimental_option("detach", True)
# 定义url
url = "https://www.shanghairanking.cn/rankings/bcur/2023"
# 启动谷歌浏览器
browser = webdriver.Chrome(options=option)
# # 浏览器最大化
# browser.maximize_window()
# 访问url
browser.get(url)
# 隐式等待
browser.implicitly_wait(5)

# 先创建一个数组,保存结果
contents = []


# 检索数据取出放进数组里面
def get_data(page):
    # 获取全部网页信息
    html = browser.page_source
    soup = BeautifulSoup(html, "html.parser")
    # 找到tbody的子节点
    for tr in soup.find('tbody').children:
        # 判断tr是否属于子节点中
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')
            # 获取文本,清除换行符,清空空格
            name = tr.find(class_="name-cn").text.replace('\n', '').strip()
            contents.append([tds[0].text.strip(), name, tds[2].text.strip(), tds[3].text.strip(),
                             tds[4].text.strip(), tds[5].text.strip()])
    print("开始爬取第", page, "页", "总计获取到", len(contents), "个学校排名")



def get_all():
    page = 1
    while page <= 20:  # 循环页数
        # print("开始爬取第", page, "页")
        get_data(page)  # 每次循环都要调用一次获取数据的函数
        next_page = browser.find_element(By.CSS_SELECTOR, 'li.ant-pagination-next>a')
        next_page.click()  # 点击下一页,selenium内置的点击事件
        page += 1  # 循环完加一


def save_data(data):
    first_name = ["排名", "学校名称", "省市", "类型", "总分", "办学层次"]
    rank = pd.DataFrame(data, columns=first_name)
    # 将字符串转为int或float类型
    rank["排名"] = rank["排名"].astype(int)
    rank["总分"] = rank["总分"].astype(float)
    # pd.to_numeric函数errors参数设为'coerce',可以将无效解析设置为NaN
    rank["办学层次"] = rank["办学层次"].apply(pd.to_numeric, errors='coerce')
    print(rank.head())

    rank.to_excel("2023中国大学排名2.xlsx", index=False)
    print("保存成功!")


if __name__ == '__main__':
    get_all()
    save_data(contents)
    # 关闭浏览器
    browser.quit()

本文首发在“程序员coding”公众号,欢迎关注与我一起交流学习。

标签:浏览器,Python,text,selenium,rank,2023,排名,page
From: https://www.cnblogs.com/stormhou/p/17977080

相关文章

  • CSP-S 2023 游记
    9月初开学,来到了BCMS。毕竟是新初一吗,军训还是要有的。军训期间总是隔三差五来到机房训练。现在回忆当时貌似啥也没学,可这确实是一份美好回忆,因为这段时间可以称得上我进步最快的阶段。当时可能主要去复习S初赛了吧。初赛去WFYZ考的,考场总共就那么几个人。赛时感觉过的挺......
  • python+flask_restful使用jwt
    正在做毕设,由于毕设需求使用python+flask,使用jwt目的是对请求进行保护,我的项目采用vue3+flask前后端分离实现,进入正题:使用jwt,首先下载扩展pipinstallFlask-JWT-Extended然后在项目中注册使用,我的项目结构是这样的 在exts.py中引入jwt扩展,fromflask_jwt_extendedimpo......
  • 昆虫科学院 AtCoder Race Ranking 2023 Autumn
    概况为提高选手们的训练/比赛热情,我们(昆虫科学院)通过商讨,在\(2023-5-25\)仿照AtCoderRaceRanking(WTF)机制,设立了“昆虫科学院AtCoderRaceRanking2023”。该排行榜为\(2023\sim2024\)赛季的第二轮排行。校内参赛选手(按照学号排序)AtCoder用户名学号......
  • Python实现线性判别分析鸢尾花数据集或随机生成两个线性可分的数据集
    线性判别分析是一种经典的线性学习方法,在二分类问题上最早由Fisher在1936年提出,亦称Fisher线性判别。线性判别的思想非常朴素:给定训练样例集,设法将样例投影到一条直线上,使得同类样例的投影点尽可能接近,异类样例的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的直线上,再根据......
  • Python中的回调函数
    先来看一个程序:deff1():print(2)return1deff2(a):print(3)returnaprint(f2(f1()))这个程序,在调用时,f2会先等待f1调用完毕,返回1之后,再进行调用,所以会输出2、3、1,但是若这样改写程序deff1():print(2)return1deff2(f):prin......
  • 【Python】查找和删除表格中的重复行
    查找:importpandasaspddf=pd.read_excel("秘籍.xlsx")#打开list1=[]foriinrange(df.shape[0]):#总行数list1.append(list(df.values[i]))#将每行以列表的形式装入列表forxinlist1:iflist1.count(x)>1:#如果列表中元素出现次数>1prin......
  • Python手相识别教程10命运线
    10命运线土星线是手相中信息量最大的线条之一。它记录了工作和生活方式的重大变化,描述了我们在人生不同阶段的安全感。这条线有很多名字:命运线、命运线,以及最贴切的安全线。命运线反映了货币安全,但这并不是土星线上显示的唯一一种安全。这条线的标记和特征可能是客观的,也可能......
  • 13--selenium回顾
    一前期准备1.1概述selenium本身是一个自动化测试工具。它可以让python代码调用浏览器,并获取到浏览器中加载的各种资源。我们可以利用selenium提供的各项功能,帮助我们完成数据的抓取1.2学习目标掌握selenium发送请求,加载网页的方法掌握selenium简单的元素定位的方法......
  • pythonUI自动化之selenium获取浏览器接口信息
    #导入Selenium库中的Chrome驱动和DesiredCapabilities类fromselenium.webdriverimportChrome,DesiredCapabilities#导入Chrome驱动的特定选项类fromselenium.webdriver.chrome.optionsimportOptions#这是主程序的入口点,只有当该文件被直接运行时,以下的......
  • 基于flask框架的python作为微信小程序后端的实现方法(个人版)
    Flask基础语法引入Flask类fromflaskimportFlask创建一个app,也就是Flask类的一个对象app=Flask(__name__)接下来写每个路径对应的函数如@app.route('/')deftest()#这里函数可以任意命名,这个函数会在访问括号里路径的时候被调用 return"helloworld"这三行代码......