0


【爬虫】2024中国大学排行榜爬取

本文旨在利用Python中的Selenium、BeautifulSoup库爬取软科2024中国大学排行榜主榜名单,方便后续分析。

相关库简介

Selenium 是一个用于 Web 应用程序测试的强大工具,可以直接在浏览器中操作和执行测试。它支持多种编程语言(如 Python、Java、C#、Ruby 等)和各种主流浏览器(如 Chrome、Firefox、Safari 等),并能够与浏览器无缝集成进行自动化测试。

Selenium 主要组件

Selenium WebDriver:核心组件,用于与浏览器进行交互。通过 WebDriver,可以控制浏览器的行为,如打开网页、点击按钮、输入文本等。

Selenium Grid:用于分布式测试,可以并行运行测试用例,从而加快测试速度。

Selenium IDE:一种用于快速创建测试脚本的浏览器插件,支持录制和回放功能。

为什么要使用Selenium 库?

观察软科的大学排行榜,进行翻页操作的时候,url是没有发生变化。那么以往使用 requests 和 BeautifulSoup根据pages信息的变化进行分页抓取操作就不再使用,只能引入Selenium框架,通过模拟鼠标的操作,实现翻页。


BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库。它创建一个解析树,用于以 Python 友好的方式提取数据。BeautifulSoup 特别适用于处理不规范的 HTML 标记,并能方便地从中提取所需的信息。

安装Selenium、BeautifulSoup

pip install Selenium
pip install BeautifulSoup

代码实现

导入相关库

# -*- coding: UTF-8 -*-# 导入相关库import csv
from bs4 import BeautifulSoup
import bs4
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains  # 鼠标操作from selenium.webdriver.common.by import By
import time

解析 HTML 文档

定义get_info 函数,用于从网页内容中提取特定信息。

# 获取信息函数defget_info(soup, _type, element, param=None):if _type =="find":if param isnotNone:
            params =dict([param.split('=')])
            res = soup.find(element,**params)else:
            res = soup.find(element)if res isnotNone:
            res = res.string.replace(" ","").replace("\n","")else:
            res ="None"if _type =="find_all":if param isnotNone:
            params =dict([param.split('=')])
            res = soup.find_all(element,**params)else:
            res = soup.find_all(element)return res

提取排行榜中的高校信息

定义 fillUnivList函数, 用于从 HTML 中提取高校的信息,并将提取到的信息填充到列表。

# 填充大学列表函数deffillUnivList(html, ulist):
    soup = BeautifulSoup(html,'html.parser')for tr in soup.find('tbody').children:ifisinstance(tr, bs4.element.Tag):# 如果为Tag类型
            td_list = tr.find_all('td')"排名"
            top = get_info(td_list[0],"find","div","class_=ranking")"logo"
            logo = td_list[1].find('img')["src"]"中文名/英文名"
            university_list = get_info(td_list[1],"find_all","a")
            ch_name = university_list[0].string.replace("\n","").replace("\t","").strip(" ")
            en_name = university_list[1].string.replace("\n","").strip(" ")"学校标签"
            tags = get_info(td_list[1],"find","p")"学校地址"
            area = td_list[2].text.replace("\n","").strip(" ")"学校行业"
            main = td_list[3].text.replace("\n","").strip(" ")"综合分数"
            score = td_list[4].text.replace("\n","").strip(" ")"办学层次"
            layer = td_list[5].text.replace("\n","").strip(" ")# 添加到列表
            ulist.append([top, ch_name, en_name, tags, area, main, score, layer, logo])

将提取的信息保存为CSV文件

# 保存到CSV函数defsaveToCSV(ulist, filename):
    headers =['排名','中文名','英文名','标签','地址','行业','分数','层次','Logo']withopen(filename,'w', newline='', encoding='utf-8-sig')as f:
        writer = csv.writer(f)
        writer.writerow(headers)
        writer.writerows(ulist)

模拟鼠标操作进行翻页

# 鼠标操作运行函数defaction_run(driver, actions, info, by=By.ID, time_num=1):while1:
        config_facesearch = driver.find_element(by=by, value=info)if config_facesearch.is_displayed(): 
            actions.move_to_element(config_facesearch).click().perform()
            time.sleep(time_num)breakelse:print("%s is not find, waiting..."%(info))
            time.sleep(1)

主函数

根据爬取页面进行设置浏览器(如 Chrome、Firefox、Safari 等)、循环次数等信息。

# 主函数if __name__ =="__main__":
    url ="https://www.shanghairanking.cn/rankings/bcur/2024"
    start = time.strftime("%H:%M:%S", time.localtime())
    driver = webdriver.Firefox()# driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get(url)
    time.sleep(2)"模拟鼠标操作"
    actions = ActionChains(driver)
    ulist =[]for i inrange(20):
        html = driver.page_source
        fillUnivList(html, ulist)
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 滚动至底部
        action_run(driver, actions, info="li[title='下一页']", by=By.CSS_SELECTOR)
    
    end = time.strftime("%H:%M:%S", time.localtime())print("用时%s - %s"%(start, end))# 时长统计# 关闭浏览器
    driver.quit()# 保存为CSV文件
    saveToCSV(ulist,'university_rankings.csv')

可能会遇到的问题

运行过程中会发生以下报错,是对应浏览器的驱动没有安装。可以浏览 Selenium详解
进行参考解决。

结果展示

如下,软科2024中国高校主榜页面的相关信息都提取保存为csv文件了。大家可以通过修改url,获取软科其他的榜单,

推荐阅读
  • 【可视化】用pyecharts绘制我国人口分布
  • 【可视化】软科2024中国大学可视化分析

欢迎关注我的公众号“AI拾贝”,原创技术文章第一时间推送。后台发送”排行榜“,自动回复源码和数据。

标签: 爬虫 python selenium

本文转载自: https://blog.csdn.net/m0_38065162/article/details/140408870
版权归原作者 晨昏三变 所有, 如有侵权,请联系我们删除。

“【爬虫】2024中国大学排行榜爬取”的评论:

还没有评论