前些日子,同事的孩子参加高考,知道分数后让我帮忙参考报学校,作为一个已过不惑之年的油腻大叔,远离学校已经16年了,各个高校在我省得录取批次、人数、分数(位次)一无所知,幸亏有无所不知的互联网,但是全国几千家高校,一个一个查起来太难了,就想如果有个excel表格记录全国高校在我省得录取情况,我就可以根据分数(位次)从容的选出能够报考的学校。郁闷的是这个数据没有。我从2021年的3月开始基础python,这几天刚好自学到爬虫这一部分,我就想能不能从网络上爬取这些数据。查找网络,有https://gkcx.eol.cn/(中国教育在线),在学校——历年分数页面有我所需要的数据,具体如下:

request爬虫获取大学排名代码 python爬取各大高校录取分数_request爬虫获取大学排名代码

黑色圈住的数据就是我需要的。

一、看到了上面的数据,但是还有一个前提条件,找到全国所有的学校,这个也好查找,图片如下:

request爬虫获取大学排名代码 python爬取各大高校录取分数_json_02

看一下,全国所有的高校有143页,接下来我要做的就是看这些数据的真实来源,只有通过浏览器中的开发真工具,最好用谷歌浏览器,按F12,通过仔细观察,我发现 这些数据的真实来源于网页中的json ,真实网址应该是https://api.eol.cn/gkcx/api/?access_token=&admissions=&central=&department=&dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page=2&province_id=&ranktype=&request_type=1&school_type=&signsafe=&size=20&sort=view_total&top_school_id=[766,707]&type=&uri=apidata/api/gk/school/lists,看一下这个网址,很容易发现,page=?是第几页列表所显示的所有学校,因为我自学还没有学到json数据爬取,我大概用了零零碎碎好几个小时来查找大神们的文章,后来发现可以通过开发工具可以很清楚的得到下面信息

request爬虫获取大学排名代码 python爬取各大高校录取分数_爬虫_03

你发现了什么,20个学校的地址,接着打开小三角,惊喜在这里:

request爬虫获取大学排名代码 python爬取各大高校录取分数_json_04

name=学校名字,school_id=学校的数字代码,这个我们先保存下来,估计以后有用。

知道这么多,我们是不是可以尝试先把全国所有的高校信息先爬下来保存,然后遍历全国高校,爬取每个高校在某省得录取数据了。我们离成功近了一步,查了好多大神的代码,选了一个我勉强能够看得懂得,稍微做一下改动,具体如下:

import json
import requests
import os
import time
import random

先导入库,有用没用的我先导入,爬虫学习的时间段,搞懂搞不懂得先拿来:

heads={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'}#请求头,这个还是可以懂的

url='https://api.eol.cn/gkcx/api/?access_token=&admissions=&central=&department=&dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page=%s&province_id=&ranktype=&request_type=1&school_type=&signsafe=&size=20&sort=view_total&top_school_id=[766,707]&type=&uri=apidata/api/gk/school/lists’ #高校列表网址(红字的部分,这个要设置变量,以便我们爬取所有高校)

list=[]#搞一个空列表,本来想存入爬取高校的名字或者id

for i in range(1,144): #这个不用说了吧,用 i 来取代页码,从1到143
     print(url%(i))#可以不用的,我是想测试地址对不对
     response=requests.get(url%(i),headers=heads)#这个也不用说了,得到一个数据
     print(proxies)#测试,可以去掉
     print(response.text)#测试,可以去掉
     json_data=json.loads(response.text)#获得json数据,不懂得可以百度,我也是复制大神的
     #try: 这个用法百度一下,防止出错程序不往下运行
     my_json=json_data['data']['item']#好像是获得josn 数据的根目录
     for my in my_json: #做个循环,提取学校id 和学校名字
         li={my['school_id']:my['name']} #每个学校的id 和学校组成一个字典的键值对
         list.append(li) #将做成的字典加入list 列表

#打印键值对

#打印列表
     #except TypeError:
         #print('pass')


    time.sleep(5)# 间隔5秒钟

二、找出各学校的录取情况

打开网址用开发工具查找,跟查学校的差不多,看看发现了什么

request爬虫获取大学排名代码 python爬取各大高校录取分数_json_05

真是网址:https://static-data.eol.cn/www/2.0/schoolprovinceindex/2020/46/42/1/1.json

我们需要提取数据为:local_batch_name,min,min_seciton,proscore, year,还要加上 学校名字,

多对比几次,很容易发现,2020是年,46是学校id(终于用上了),42是省分代码,1是理科(可以推断一下 2是理科),后面的1.json是一样的,稳妥起见,我就先下载2020年全国高校在我省招生理科的全部数据:

urlkzx='https://static-data.eol.cn/www/2.0/schoolprovinceindex/2020/%s/41/2/1.json'#构造真是网址,
           res=requests.get(urlkzx%(my['school_id']),headers=heads)#得到数据,school_id来自于上一次爬取学校名称的循环
             kzx_json_data=json.loads(res.text)#数据json化
             kzx_json=kzx_json_data['data']['item']#找到根目录
             for kzx in kzx_json:#在根目录下一次提取具体数据


               
                kzxlist=[my['name'],kzx['year'],kzx['local_batch_name'],kzx['zslx_name'],kzx['min'],kzx['min_section'],kzx['proscore']] #将每个学校的每次提取数据装入列表,仔细观察my['name']来自于上一次爬取学校名称的循环,

result = open('result.xls', 'a+', encoding='gbk') # 定义指定输出Excel文件的名称,读入方式,编码方式,参数'w'表示往指定表格读入数据,会先将表格中原本的内容清空 ,若把参数’w'修改为‘a+',即可实现在原本内容的基础上,增加新写入的内容
                 for ex in range(0, len(kzxlist)): 这个循环是上一个for循环的子循环
                     result.write(str(kzxlist[ex]))
                     result.write('\t')  # '\t'表示每写入一个元素后,会移动到同行的下一个单元格
                 result.write("\n")  # 换行操作result.close() 关闭文件

大体就这样了,好多东西没理解的情况写的,肯定有好多错误的地方,但是已经试验过,可以用。