更新时间:2023-10-15 16:09:30作者:佚名
前些日子,朋友的女儿出席中考,晓得分数后让我帮忙参考报校区,作为一个已过弱冠之年的油腻阿姨,远离中学早已16年了,各个院校在我省得投档批次、人数、分数(位次)一无所知,幸好有无所不知的互联网,并且全省几千家院校,一个一个查上去太难了,就想假如有个excel表格记录全省院校在我省得投档情况,我就可以按照分数(位次)从容的选出才能报名的中学。沮丧的是这个数据没有。我从2021年的3月开始基础,这几天正好自学到爬虫这一部份,我就想能不能从网路上爬取这种数据。查找网路,有(中国教育在线),在中学——历年分数页面有我所须要的数据,具体如下:
红色圈住的数据就是我须要的。
一、看到了里面的数据,并且还有一个前提条件,找到全省所有的中学,这个也好查找全国大学录取分数线表,图片如下:
看一下,全省所有的院校有143页,接出来我要做的就是看那些数据的真实来源,只有通过浏览器中的开发真工具,最好用微软浏览器,按F12,通过仔细观察,我发觉这种数据的真实来始于网页中的json,真实网址应当是page=2&=&=&=1&=&=&size=20&sort=&=[766,707]&type=&uri=/api/gk//lists,看一下这个网址,很容易发觉,page=?是第几页列表所显示的所有中学,由于我自学还没有学到json数据爬取,我大约用了零零碎碎好几个小时来查找高手们的文章全国大学录取分数线表,后来发觉可以通过开发工具可以很清楚的得到下边信息
你发觉了哪些,20个校区的地址,接着打开小三角,惊喜在这儿:
name=中学名子,=中学的数字代码,这个我们先保存出来,恐怕之后有用。
晓得那么多,我们是不是可以尝试先把全省所有的院校信息先爬出来保存,之后遍历全省院校,爬取每位院校在某省得投档数据了。我们离成功近了一步,查了很多前辈的代码,选了一个我勉强才能看得懂得,稍稍做一下改动,具体如下:
json
os
time
先导出库,有用没用的我先导出,爬虫学习的时间段,搞清搞不懂得先用来:
heads={'user-agent':'/5.0(NT10.0;Win64;x64)/537.36(KHTML,likeGecko)/91.0.4472.106/537.36'}#恳求头,这个还是可以懂的
url='page=%s&=&=&=1&=&=&size=20&sort=&=[766,707]&type=&uri=/api/gk//lists’#院校列表网址(红字的部份,这个要设置变量,便于我们爬取所有院校)
list=[]#搞一个空列表,原本想存入爬取院校的名子或则id
foriinrange(1,144):#这个不用说了吧,用i来代替页脚,从1到143
print(url%(i))#可以不用的,我是想测试地址对不对
=.get(url%(i),=heads)#这个也不用说了,得到一个数据
print()#测试,可以除去
print(.text)#测试,可以除去
=json.loads(.text)#获得json数据,不懂得可以百度,我也是复制高手的
#try:这个用法百度一下,避免出错程序不往下运行
=['data']['item']#似乎是获得josn数据的根目录
formyin:#做个循环,提取中学id和中学名子
li={my['']:my['name']}#每位中学的id和中学组成一个字典的通配符对
list.(li)#将弄成的字典加入list列表
print(li)#复印通配符对
print(list)#复印列表
#:
#print('pass')
time.sleep(5)#间隔5秒钟
二、找出各中学的投档情况
打开网址用开发工具查找,跟查中学的差不多,瞧瞧发觉了哪些
真是网址:
我们须要提取数据为:,min,,,year,还要加上中学名子,
多对比几次,很容易发觉,2020是年,46是中学id(总算用上了),42是省分代码,1是理科(可以推测一下2是理科),旁边的1.json是一样的,稳当起见,我就先下载2020年全省院校在我省招生理科的全部数据:
='%s/41/2/1.json'#构造真是网址,
res=.get(%(my['']),=heads)#得到数据,来自于上一次爬取中学名称的循环
=json.loads(res.text)#数据json化
=['data']['item']#找到根目录
forkzxin:#在根目录下一次提取具体数据
=[my['name'],kzx['year'],kzx[''],kzx[''],kzx['min'],kzx[''],kzx['']]#将每位中学的每次提取数据放入列表,仔细观察my['name']来自于上一次爬取中学名称的循环,
=open('.xls','a+',='gbk')#定义指定输出Excel文件的名称,读入形式,编码方法,参数'w'表示往指定表格读入数据,会先将表格中本来的内容清空,若把参数’w'更改为‘a+',即可实现在先前内容的基础上,降低新写入的内容
forexinrange(0,len()):这个循环是上一个for循环的子循环
.write(str([ex]))
.write('t')#'t'表示每写入一个元素后,会联通到同行的下一个单元格
.write("n")#换行操作
.close()关掉文件
大体就这样了,很多东西没理解的情况写的,肯定有很多错误的地方,而且早已试验过,可以用。