Python 爬取高校历年分数线

2023-11-10

最近一周一直在帮家里小弟看高考志愿,所以更新的没那么频繁了,请大家见谅。

在看各高校的往年分数时,忍不住手痒,想着能不能给它爬下来?哈哈,说干就干!

1 流程分析

之前无意中在这个网站发现有各个高校的历年录取分数线:https://gkcx.eol.cn

我们的目标是用 Python 将下面页面的数据导出到 Excel:

南京邮电大学

这个页面的 URL 是:https://gkcx.eol.cn/schoolhtm...,显然是需要一个 school_id 拼接而成的,那么如何获取这个 school_id 呢?

除非想办法爬取到所有院校的 school_id,这里我想着是从上面图中的搜索框进入:

搜索结果

这样,整体的业务流程我们就理清楚了:

  • 先调用搜索的 URL 获取到高校的 school_id,拼接到高校的详情访问地址
  • 访问详情地址,抓取目标数据
  • 处理目标数据,存储到 Excel 中

2 获取 school_id

按下 F12,可以看出搜索调用的 URL 是:https://gkcx.eol.cn/soudaxue/queryschool.html?&keyWord1=南京邮电大学,但是我们发现该请求的 response 里并没有高校列表,所以猜测这里是有二次数据请求获取到高校的列表,然后解析显示到页面的。

顺着请求流,我们看到了这么一个请求:

获取高校列表

并且它的 response 刚好是一个包含高校信息的 json,到这里应该还是顺利的,我们只要从这个 json 里解析出我们想要的东西,然后继续后面的步骤就可以了。要注意该请求的 Referer

但是在解析这个 json 时会遇到一个小问题,返回的数据格式是这样的:

({
 "totalRecord": {"num": "2"},
 "school":  [
    {
   "schoolid": "160",
   "schoolname": "南京邮电大学",
...
});

它是被 (); 包围着的,不是一个合法的 json 数据,这里需要对其进行处理后才能解析 json:

    # 返回数据包含 ();,需要特殊处理
    text = ((response.text).split(');',1)[0]).split('(',1)[1]
    j = json.loads(text)

3 分数线获取

学校的详情页面是:https://gkcx.eol.cn/schoolhtm...,同样的套路,在点击后 response 里并没有分数线数据,我想也是二次请求吧,果然在请求流里找到了这个:

分数线数据

这里的两个请求刚好将高校的每年分数线和各专业的分数线以 XML 的格式返回,Very Good!

下面要做的就是 XML 解析啦。

4 XML 解析

这里我们使用 xml.etree.ElementTree 来解析 XML:

<areapionts>
    <areapiont>
        <year>2017</year>
        <specialname>软件工程(嵌入式培养)</specialname>
        <maxfs>369</maxfs>
        <varfs>366</varfs>
        <minfs>364</minfs>
        <pc>一批</pc>
        <stype>理科</stype>
    </areapiont>

由于数据比较规整,解析也很简单:

areapionts = ET.fromstring(response.text)
for areapiont in areapionts:
    print(areapiont.find('year').text)
    print(areapiont.find('specialname').text)

5 Excel 写入

Excel 的写入需要借助于 openpyxl 模块。

  • openpyxl 简单使用示例
>>> import openpyxl
>>> wb = openpyxl.Workbook()
# 初始时会生成一个 sheet 页
>>> wb.sheetnames
['Sheet']
# 创建 sheet 页
>>> wb.create_sheet(index=0,title='First')
<Worksheet "First">
# 获取所有 sheet 页
>>> wb.sheetnames
['First', 'Sheet']
# 删除 sheet 页
>>> wb.remove(wb['Sheet'])
>>> wb.sheetnames
['First']
>>> sheet = wb['First']
# 设置单元格
>>> sheet['A1'] = '省份'
>>> sheet['B1'] = '学校'
# 设置指定的单元格
>>> sheet.cell(1,3).value='test'
>>> wb.save('test.xlsx')
  • XML 解析写入 Excel
def gen_excel(school,xml,wb):
    sheet = wb.create_sheet(title='各专业历年录取分数线')
    sheet.column_dimensions['B'].width = 40
    sheet['A1'] = '年份'
    sheet['B1'] = '专业'
    sheet['C1'] = '最高分'
    sheet['D1'] = '平均分'
    sheet['E1'] = '最低分'
    sheet['F1'] = '批次'
    sheet['G1'] = '录取批次'

    areapionts = ET.fromstring(xml)
    column = 1 
    for areapiont in areapionts:
        column += 1
        sheet.cell(column,1).value = areapiont.find('year').text
        sheet.cell(column,2).value = areapiont.find('specialname').text
        sheet.cell(column,3).value = areapiont.find('maxfs').text
        sheet.cell(column,4).value = areapiont.find('varfs').text
        sheet.cell(column,5).value = areapiont.find('minfs').text
        sheet.cell(column,6).value = areapiont.find('pc').text
        sheet.cell(column,7).value = areapiont.find('stype').text
    wb.save('{}.xlsx'.format(school['schoolname']))

执行效果

$ python gkcx.py
Please the school name:南京邮电大学
共检索到 2 个高校:['南京邮电大学', '南京邮电大学通达学院']
数据获取完成,已下载到脚本目录

执行结果

结果看着还可以,但是还是有问题的,因为各省的分数线肯定是不一样的,这里默认检索出的是学校所在省的分数线,因此若要获取在其他省的分数线,还需要进一步处理,有兴趣的同学不妨动手试一下。后台回复「高考」可以获取源码。


如果觉得有用,欢迎关注我的微信,一起学习,共同进步,不定期推出赠书活动~

你的关注是对我最大的鼓励!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 爬取高校历年分数线 的相关文章

随机推荐

  • Postman之全局变量、环境变量

    1 什么是环境变量 环境变量 postman可以自定义环境参数值 这样就不用每次请求都去输入某些值 直接引用设置的值 使我们的测试更方便 例如 通过变换环境变量来快速变换环境地址 可将本地 测试环境的IP添加至不同的环境变量 调用时使用 x
  • 'react-scripts' 不是内部或外部命令 、propTypes is not defined 解决办法

    在手动安装了React 提供的第三方库 prop types报错的 我的React 就报错运行不了了 报错如下 react scripts 不是内部或外部命令 也不是可运行的程序 或批处理文件 这是一个在学习React 踩的坑 百度了一下
  • webpack打包vue

    在Windows10系统下 自定义打包整个Vue文件夹项目的相关配置项涉及以下内容 安装Node js和npm Node js官网 https nodejs org en download npm是Node js的包管理工具 在Node j
  • JDK8 Date 日期常用使用方法

    JDBC日期的转换 最新JDBC映射将把数据库的日期类型和Java 8的新类型关联起来 SQL gt Java date gt LocalDate time gt LocalTime timestamp gt LocalDateTime L
  • X11相关参数设置

    X11相关参数设置 X11 环境变量 DISPLAY 用来设置将图形显示到何处 变量格式 Xlib connection to 0 0 refused by server 开关闭屏幕显示 连接实际屏幕 确认实际屏幕的name of disp
  • 模式识别和计算机应用(转载)

    导读 只是覆盖了很小的范围 但总结的不错 1 数学方面 1 矩阵的各种分解 比如 LU QR Cholesky SVD Polar 2 广义逆与子空间 3 最小二乘法 特别齐性方程Ax b的各种解法及其几何意义 4 凸分析与凸优化的基本知识
  • 8种专坑同事的 SQL 写法,性能降低100倍,你学会了吗?

    程序员的成长之路 互联网 程序员 技术 资料共享 关注 阅读本文大概需要 14 分钟 来自 juejin cn post 6844903998974099470 1 LIMIT 语句 分页查询是最常用的场景之一 但也通常也是最容易出问题的地
  • R语言Logistic回归模型深度验证以及Nomogram绘制

    R语言Logistic回归模型深度验证以及Nomogram绘制 小易学统计 互联网医疗统计师 自立 爱家人 15 人 赞同了该文章 01 研究背景
  • openwrt解除软件包安装限制

    Openwrt解除验证限制 sed i s tdetect package t detect package g koolshare scripts ks tar install sh
  • 安卓开发笔记——关于java.lang.RuntimeException: Unable to start activity ComponentInfo{......}问题的解决方案

    笔者在实现一个消息上下轮播时 遇到APP闪退 将日志打印出来 Process com ghl intelligence PID 6557 java lang RuntimeException Unable to start activity
  • 公众号如何快速接入查题功能

    最近很多同学私信小睿 我不会编程 写代码 我怎么能做一个自己的查题公众号呢 既然这么多同学最近在问 那小睿今天就来告诉大家 调用量瞩目 首先你需要一个查题的接口 然后配置到公众号内就可以了 那么接口从哪儿来呢 当然是找小睿啦 小睿为了使大家
  • 内核自带的基于GPIO的LED驱动学习(二)

    2 分析平台驱动的probe函数 好 既然这个LED驱动使用的是平台驱动框架 当设备和驱动匹配上之后 就会执行指定的probe函数 那接下来的工作就转移到分析对应的probe函数了 为了直观 我把probe函数也粘贴上来 static in
  • 【计算机网络】湖科大微课堂笔记 p2-p3 因特网概述、三种交换方式

    视频 计算机网络已从通信基础设施发展成重要的信息服务基础设施 因特网概述 网络 互联网和因特网的概念 理解 因特网发展的三个阶段 了解 因特网的标准化工作 了解 因特网的组成 理解 网络 互联网和因特网的概念 理解 左图是网络 右图是互联网
  • 转:《C++ Templates》读书笔记

    有三种模板参数 形参 1 类型参数 这是使用得最多的 2 非类型参数 3 模板的模板参数 类型参数 类型参数是通过关键字typename或者class引入 关键字后面必须是一个简单的标识符 后面用逗号来隔开下一个参数声明 等号代表接下来的是
  • U盘病毒 hypertrm.exe 修复

    1 最近电脑中了这种病毒 没有直观的感觉 不会蓝屏 也不会有其他任何异样 恶心的是他在我每次插入U盘的时候会提示INF默认安装 我没有对病毒样本做分析 感觉他只是创建了系统钩子 导致我尽管杀掉了u盘里所有的病毒 再次插上一切还会重来 2 解
  • String转字节数组

    Java语言中字符串类型和字节数组类型相互之间的转换是经常发生的 网上的分析以及代码也比较多 本文将分析分析常规的byte 和String之间的转换 1 String转byte 就是调用String类的getBytes 方法 如果没有带参数
  • 企业微信中授权小程序

    授权的时候先判断当前小程序运行环境 使用企业微信专有接口wx getSystemInfo if res environment wxwork 企业微信环境 wx qy login 获取企业微信派发的临时登录凭证 success res gt
  • PCL 计算点云的主曲率

    目录 一 算法原理 1 算法源码 2 特别提醒 3 曲率显示 二 代码实现 三 结果展示 四 测试数据 一 算法原理 1 算法源码 template
  • 用消息队列实现AB进程随时通信,在共享内存中循环逆置打印字符串

    一 要求实现AB进程随时对话 A进程发送一句话给B进程 B进程接收后打印 B进程回复一句话给A进程 A进程接收后打印 随机重复1 2步骤 当收到quit后 要结束AB进程 A进程 include
  • Python 爬取高校历年分数线

    最近一周一直在帮家里小弟看高考志愿 所以更新的没那么频繁了 请大家见谅 在看各高校的往年分数时 忍不住手痒 想着能不能给它爬下来 哈哈 说干就干 1 流程分析 之前无意中在这个网站发现有各个高校的历年录取分数线 https gkcx eol