Python 助你填写高考志愿
admin
2023-02-15 06:20:03
0

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

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

1 流程分析

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

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

Python 助你填写高考志愿

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

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

Python 助你填写高考志愿

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

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

2 获取 school_id

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

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

Python 助你填写高考志愿

并且它的 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/schoolTemple/school160.htm,同样的套路,在点击后 response 里并没有分数线数据,我想也是二次请求吧,果然在请求流里找到了这个:

Python 助你填写高考志愿

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

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

4 XML 解析

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


    
        2017
        软件工程(嵌入式培养)
        369
        366
        364
        一批
        理科
    

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

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')

# 获取所有 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 个高校:['南京邮电大学', '南京邮电大学通达学院']
数据获取完成,已下载到脚本目录

Python 助你填写高考志愿

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


Python 助你填写高考志愿

最近搜集到慕课网视频,视频内容涵盖 Python、Java、PHP、前端、小程序、算法、架构、数据库等等!关注本公众号,后台回复「慕课网」即可获取下载地址。

相关内容

热门资讯

“特朗普急着结束战争,不然得找... 【文/观察者网 柳白】特朗普计划的访华日期临近,外界对中东局势与中美博弈的关联讨论持续升温。《华尔街...
同远电气取得挥发性有机气体检测... 国家知识产权局信息显示,新乡市同远电气有限公司取得一项名为“一种用于挥发性有机气体的检测设备”的专利...
山东机器人产业何以“全速”奔跑 5月1日,刚刚在北京亦庄人形机器人半程马拉松完赛的山东本土“顶流”——“行者泰山”人形机器人,作为“...
探访游客坠亡事发地:瀑布秋千为... 澎湃新闻记者 王鑫5月3日下午,一名年轻女游客在四川省华蓥市玛琉岩探险公园体验瀑布秋千项目时不幸坠落...
原创 未... 马斯克近期公开分享了他对未来十年的规划,核心观点是未来人们无需上班,机器人将承担主要的财富创造工作。...
孙东:香港今明两年推AI旗舰项... 观点网讯:5月7日,香港创新科技及工业局局长孙东在立法会会议上表示,政府正推进多项人工智能相关布局,...
原创 一... PChome产品评测,一加手机今年在电竞游戏体验赛道持续发力,全系列标配165Hz高刷屏,游戏适配覆...
谷歌发布紧急补丁,修复三星Ga... IT之家 5 月 7 日消息,科技媒体 Android Authority 昨日(5 月 6 日)发...
悬崖秋千坠亡女孩头部两次被撞,... 5月3日下午,四川省华蓥市玛琉岩探险公园发生一起人员伤亡事故,游客刘某某(女)在体验瀑布秋千项目时受...
外交部:中美双方就特朗普总统访... 5月7日,外交部发言人林剑主持例行记者会。有记者就特朗普访华期间合作议题提问。对此,林剑表示,中美双...