资讯专栏INFORMATION COLUMN

Python 爬取高校历年分数线

WilsonLiu95 / 4011人阅读

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

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

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

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:


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

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


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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41988.html

相关文章

  • 爬虫 - 收藏集 - 掘金

    摘要:在这之前,还是有必要对一些概念超轻量级反爬虫方案后端掘金前言爬虫和反爬虫日益成为每家公司的标配系统。 爬虫修炼之道——从网页中提取结构化数据并保存(以爬取糗百文本板块所有糗事为例) - 后端 - 掘金欢迎大家关注我的专题:爬虫修炼之道 上篇 爬虫修炼之道——编写一个爬取多页面的网络爬虫主要讲解了如何使用python编写一个可以下载多页面的爬虫,如何将相对URL转为绝对URL,如何限速,...

    1fe1se 评论0 收藏0
  • Java爬虫之爬取中国高校排名前100名并存入MongoDB中

    摘要:介绍在博客爬虫爬取中国高校排名前名并写入中,我们利用来写爬虫,将中的大学排名表格爬取出来,并存入到中。本次分享将用的来实现相同的功能,并将爬取到的数据存入到数据库中。 介绍   在博客:Python爬虫——爬取中国高校排名前100名并写入MySQL中,我们利用Python来写爬虫,将http://gaokao.xdf.cn/201702/1... 中的大学排名表格爬取出来,并存入到My...

    jzzlee 评论0 收藏0
  • Java爬虫之爬取中国高校排名前100名并存入MongoDB中

    摘要:介绍在博客爬虫爬取中国高校排名前名并写入中,我们利用来写爬虫,将中的大学排名表格爬取出来,并存入到中。本次分享将用的来实现相同的功能,并将爬取到的数据存入到数据库中。 介绍   在博客:Python爬虫——爬取中国高校排名前100名并写入MySQL中,我们利用Python来写爬虫,将http://gaokao.xdf.cn/201702/1... 中的大学排名表格爬取出来,并存入到My...

    GeekQiaQia 评论0 收藏0
  • 我用Python爬取了五千张美女图壁纸,每天一张忘记初恋!

    摘要:爱美之心人皆有之,正所谓窈窕淑女君子好逑,美好敲代码的一天从好看的桌面壁纸开始,好看的桌面壁纸从美女壁纸开始。 大家好,我是辣条,这是我爬虫系列的第26篇。 爱美之心人皆有之,正所谓窈窕淑女君子好逑,美好敲代码的一天从好看的桌面壁纸开始,好看的桌面壁纸从美女壁纸开始。今天给大家带来福利啦,爬...

    huaixiaoz 评论0 收藏0
  • 23个Python爬虫开源项目代码,包含微信、淘宝、豆瓣、知乎、微博等

    摘要:今天为大家整理了个爬虫项目。地址新浪微博爬虫主要爬取新浪微博用户的个人信息微博信息粉丝和关注。代码获取新浪微博进行登录,可通过多账号登录来防止新浪的反扒。涵盖链家爬虫一文的全部代码,包括链家模拟登录代码。支持微博知乎豆瓣。 showImg(https://segmentfault.com/img/remote/1460000018452185?w=1000&h=667); 今天为大家整...

    jlanglang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<