温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者:游万海 (福州大学)
E-Mail: hnstedu@163.com
本文目的在于学术交流和 R 语言学习,文中分析结果不能直接作为高考填报志愿的依据,特此声明。
一句话的事:
给我你的高考分数与省份,我就能给你一份可报考的高校名单 ^~^
海哥这两天被各路亲戚朋友「骚扰」……
干啥?
全是天大的事儿!
给孩子选学校呀!
谁不想把「分数」用足?
谁不想稳稳当当?
难呀!辣么多高校,咋选?咋选?
没事,这不,海哥有武器呀!
弄一段小程序,谈笑间帮你列个清单,都是「私人定制」。
不过,话又说回来了,
历史虽然经常重演,但也有变数,
所以,我们提供的建议,仅供参考,
万一娃娃不小心被 MIT 或 Yale 掳走了,
别跟海哥吐槽机票太贵呀,哈哈。
高考志愿填报是一件很烧脑的事儿!!对于考生而言,要从大量的高校中筛选出可报考的高校。一个一个学校查询,工作量巨大,而且很可能一不留神头脑晕乎,就遗漏了某些高校。
本文主要目的是利用 R 软件,通过简单的几段代码,快速准确的完成上述工作。哪怕你对 R 软件一无所知,只需要会安装就 OK 了~~
第一,下载并安装免费 R 软件;
下载地址:https://cran.r-project.org/
第二,打开软件,点击左上角 「文件」→ 「新建程序脚本」,将弹出一个窗口;
第三,将本文附录中的代码复制到该窗口。在 D 盘 中新建文件夹 school_choose,下载附录中的院校文件到该文件夹中;并在 school_choose 文件夹下创建两个子文件夹: school 和 result。
第四,根据自身情况,只需修改四个信息:
curriculum = "理科" # 文科 或 理科
batchName = "本科一批" # 本科一批 或 本科二批
province = "福建" # 考生所在省份
aim_score = 43783 # 考生在本省的排名
第五,将窗口内的内容全部选中,按 ctrl + R
运行,稍等片刻,就可以轻松获得推荐的报考高校名单。
注:目标高校筛选标准是根据近 5 年最低录取名次,只要考生排名至少 1 次在某高校最低录取名次之内,即认定为目标高校。
按照上述设置,筛选的符合条件的部分高校如下:
......
下面是分析过程和 R 语言实现过程 (如果你的问题已经解决,就不用看了)
一年一度的高考已经结束,这几天各省份都陆续放榜,有超水平发挥的也有发挥失常的,自然是几家欢喜几家愁。成绩已然无法改变,但是志愿填报尤其关键,只要掌握填报技巧,依然可能有机会可以上个不错的学校。
通常每年各省的教育考试院会公布普通高校招生分数段统计表,根据这个就可以清楚自己在全省的排名。结合每个高校当年在所在省份招生的最低分排名和招生人数,就可以大致判断填报这个学校被成功录取的机会。
本讲我们将利用 R
语言,通过爬取和分析网上相关数据,迅速筛选符合条件的高校,为各位考生和家长填报志愿提供参考。
以 https://gaokao.baidu.com/gaokao/m/school/home?word=清华大学 为例,选择福建省,在最低分排名目录下可以得到下图
从上图可以看出,清华大学近三年在福建省理科的招生最低排名要求,2017 年要求排在全省 84 名,2018 年要求排在全省 84 名,2019 年要求排在全省 80 名,这个信息可以作为志愿填报的一个重要参考。
例如,福建理科考生 A 今年的考试成绩为 689 分,这个分位段共有 13 位同学,排在全省 84 名。考生 B 的考试成绩为 688 分,这个分位段共有 10 位考生,排在全省 94 名。根据清华大学往年在福建理科录取的最低分排名,考生 A 有望被清华大学录取,而考生 B 被录取的机会就很小。当然,具体填报过程中还需要结合清华大学今年在福建省的招生人数进一步确定。
从上面分析可以看出,对于考生 B,其填写清华大学被录取的机会较小,那么这些考生应该填写哪所大学?接下来咱们再看看 复旦大学,其录取相关信息如下图所示 ( https://gaokao.baidu.com/gaokao/m/school/home?word=复旦大学 )
可以看出,复旦大学近三年在福建省理科的招生最低排名要求,2017 年要求排在全省 281 名,2018 年要求排在全省 112 名,2019 年要求排在全省 170 名。近三年复旦大学在福建省招生最低分排名变动较大,但是不管如何,考生 B 位于全省第 94 名,填报这个学校希望很大。
看到这里,或许有些人认为用这样手动的方法也能实现这些信息的利用,这样手动的缺点是得每个学校过一遍。对于高分考生,其选择的机会是既多又少,可以选择较差的学校 (^~^一般不会选),也可以选择较好的学校 (一般排名前几的学校),那么这样需要看的学校往往就很少,工作量较小。但是,对于大部分的考生,用这样的方法将是非常费时的。
例如,考生 C 的总分为 500 分,排在全省 43783 名左右,对于这位考生想了解如何填写志愿会比较稳妥。填报太差的学校不甘心,毕竟比本科线高了 98 分 (本科批分数线 402 ) 。那么他必须将心中的意向学校一个一个的过一遍,重复上面的步骤。
写到这里,我相信各位应该明白这篇推文的目的。是的,这篇推文我们将介绍如何利用软件对这些重复的工作进行批量处理。能够做到 只要给定考生的所在省份及在全省的排名位次,根据各大高校近几年在考生所在省份的招生相关信息,就可以快速匹配出符合条件的高校。
在明确了目标之后,下面就具体看看如何爬取这些相关信息。
这里我们主要关注的是某校在某个省份招生的最低分排名,首先对这个网页进行分析。点击 右键 → 查看网页源代码 (Ctrl+U),可以看到没有包含我们想要的这些信息。进一步地,点击 右键 → 检查 → Network
,可以得到下图相关信息
从图形可以看出,这里包括了几个主要的字段:
query
: 清华大学。用于学校识别。
province
: 福建。用于省份识别。
curriculum
: 理科。用于文理科识别。
batchName
: 本科一批。用于批次识别。
目前,我们还未看到 80, 84, 84 这些数字。根据经验,点击左边的网址,右键 → Copy → Copy link address,将复制的网址在浏览器中输入,得到如下的网页
可以看出,需要的信息就隐藏在这个网址中,从这里也容易看出是以 JSON
这样的轻量级格式存贮的。同时,上述提到的用于学校、省份、文理科、录取批次这些信息也隐藏在这个网址中。
接下来,进一步对网址进行分析:
Note:上述网址看似复杂,其实是因为中文字符被转码了,地址栏中显示的信息为:https://gaokao.baidu.com/gaokao/gkschool/scoreenroll?ajax=1&query=清华大学&province=福建&curriculum=理科&batchName=本科一批
从上述可以看出,这个网址由几个部分组成:
第1: https://gaokao.baidu.com/gaokao/gkschool/scoreenroll?
第2:ajax=1&
第3:query=%E6%B8%85%E5%8D%8E%E5%A4%A7%E5%AD%A6&
第4:province=%E7%A6%8F%E5%BB%BA&
第5:curriculum=%E7%90%86%E7%A7%91&
第6:batchName=%E6%9C%AC%E7%A7%91%E4%B8%80%E6%89%B9
通过上述分析,我们明白了这个网址的构成,除了第一部分,后面第 2-6 部分对应了前面分析字段 query
、province
、curriculum
、batchName
,这样就可以利用这些字段进行循环获取数据。
到这里分析基本结束,只是还存在一个问题,为什么这里复制的网址和前面一个图形中显示的不一致,如
https://gaokao.baidu.com/gaokao/gkschool/scoreenroll?ajax=1&query=%E6%B8%85%E5%8D%8E%E5%A4%A7%E5%AD%A6&province=%E7%A6%8F%E5%BB%BA&curriculum=%E7%90%86%E7%A7%91&batchName=%E6%9C%AC%E7%A7%91%E4%B8%80%E6%89%B9
可以看出,基本的组成是一样,只是有些是显示中文,有些是看不懂的编码,但是它们之间却是一一对应的,只是进行了编码,即 UrlEncode
编码。 为了进行测试,我们打开一个
URL
在线编码解码工具网站,
上图信息验证了我们的猜想,那么其余字段也是一样的,大家不妨可以去逐一试验。
第一步:定义函数
master_web = 'https://gaokao.baidu.com/gaokao/gkschool/scoreenroll?ajax=1&'
library(curl)
library(jsonlite)
##定义函数
score_fun <- function(query,province,curriculum,batchName){
firstp = curl_escape(query)
secondp = curl_escape(province)
thirdp = curl_escape(curriculum)
fourthp = curl_escape(batchName)
url = paste(master_web,'query=',firstp,'&province=',secondp,'&curriculum=',thirdp,'&batchName=',fourthp,sep="")
#print(url)
web = readLines(url,encoding="UTF-8", warn=F)
rating <- fromJSON(web)
flag = rating$msg
if (flag=="没有符合条件的数据"){
print("Not OK")
}else{
data1 = rating$data$minScoreOrder
if (is.null(data1)==T) {
print("No")
}else{
pos = lapply(data1$value,function(x) x$value[1])
record = data.frame(school=query, year = data1$key,score=unlist(pos))
}
}
}
其中:master_web
、firstp
、secondp
、thirdp
、fourthp
用于真实网站的构造,firstp
、secondp
、thirdp
、fourthp
分别用于识别 学校、省份、文理科、录取批次,下面给定考生的信息,将变动学校字段进行循环抓取数据。
这段程序中,还有几点需要说明:第一,curl_escape
是 R 中 curl
包的一个函数,用于 URL 的解码;第二,前文已经提过数据是以 JSON 格式存贮在网址中,R 中有多个包可以用于分析这些数据,这里主要是利用 jsonlite
包中的 fromJSON
函数。
第二步:下载全国高校信息
各位可以到教育部网站下载 全国高等学校名单,并将每个省份的高校名单分别保存为 csv 格式的文件。
http://www.moe.gov.cn/mdcx/qggdxxmd/201912/t20191217_10000023.html#
第三步:循环获取数据
##省份循环
setwd("D:\\school_choose") #设置工作路径
#考生相关信息
curriculum="理科"
batchName="本科一批"
province = "福建"
files = list.files(pattern=".csv")
for (i in 1:length(files)){ #省份循环
#for (i in 2:2){ #省份循环
filename1 = substr(files[i],1,nchar(files[i])-4)
filename = paste("D:\\school_choose\\result\\",filename1,"_run",".csv",sep="")
listresult = list()
dataf = read.csv(files[i],stringsAsFactors = F)
query = dataf$name
#province = gsub('(省|市)',"",dataf$province)[1]
for (j in 1:length(query)){ #省份内学校循环
print(query[j])
listresult[[j]] = score_fun(query[j],province,curriculum,batchName)
}
lresult = Filter(function(x) {is.null(nrow(x))==F}, listresult)
allresult = do.call(rbind,lresult)
write.csv(allresult,file=filename,row.names=F)
print(paste(filename1,"done"))
Sys.sleep(3)
}
运行上述程序后,可以在所设置的路径下看到这些文件
打开 fujian_run.csv
从上图可以看到福建省内各个学校在本省的招生情况,例如厦门大学,要求理科全省排名 4000 名左右(包括 4000 以前)的考生才能上线。
再来看下北京的高校在福建省理科的招生要求
从图形可以得到,北京大学在福建省理科招生要求在全省排名 70名以内。
第四步:具体使用
假如有福建理科考生 A,2020 年高考分数为 500 分,排名位于全省 43783名,那么根据近几年的数据,可以填报哪些学校呢?
今年福建的本科线 402 分,因为今年未区分本科一批和本科二批,下面以本科二批为例,看可以填报哪些学校?
首先,设置 batchName
="本科二批",curriculum
="理科"
,province
= "福建",这样筛选出来的即是全国各大高校在福建省招收的理科二批最低要求。
例如:以安徽省为例,所有在福建省招生情况如下
安徽工业大学 2019 年在福建的招生最低排位为 41185 名,考生 A 排名位于全省 43783 名,按照这个标准是可以填报这个学校。
需要注意的是,将 batchName
设置为 本科二批,那么符合报考条件的一些学校(如某大学 A 在福建按照本科一批招生)将筛选不出来,所以如果要筛选出这些高校,则需要重新设置 batchName
为 本科一批。
接下来将各个省份符合要求的高校进行合并,并以排位大于 43783 的筛选出来,设置 diff
= 最低分排名要求 - 43783,如果 diff 大于 0,即可以填报这个学校。
setwd("D:\\school_choose\\result")
m_result = list()
aim_score = 43783 #考生的排名位次
diff_score = 0
files = list.files(pattern=".csv")
for (i in 1:length(files)){
print(i)
file_name1 = substr(files[i],1,nchar(files[i])-8)
mydata = try(read.csv(files[i]),silent = T)
if (length(names(mydata))<=1) {
print("Not qualified")
}else{
#subdata = subset(mydata,year!="Not qualified")
mydata$diff = suppressWarnings(as.numeric(as.vector(mydata$score))) - aim_score
mydata$p_name = file_name1
m_result[[i]] = subset(mydata,diff > diff_score)
}
}
mlresult = Filter(function(x) {is.null(nrow(x))==F}, m_result)
m_result1 = do.call(rbind,mlresult)
aim_file = paste("D:\\school_choose\\school\\","f_二批",".csv",sep="")
write.csv(m_result1,file=aim_file,row.names=F)
根据条件设置,将符合要求的高校筛选出来后,再结合自身的地域偏好和专业喜欢,进一步筛选目标高校。
本文基于志愿填报这一需求,以各高校录取的最低分排名这一信息为标准,利用 R 软件从网络爬取相关的数据信息,快速锁定目标高校,可为志愿填报提供一定的参考。但是,填报有风险,本文的结论仅仅作为辅助,志愿填报还需结合各自的地域、专业等偏好进行选择,也应充分考虑到报考学校存在大小年这一风险。在此,祝各位考生都能考到心仪的大学!
本文所用数据来源于教育部政府门户网站等,感谢这些网站提供数据。本文仅作为学术交流,勿用于商业用途!
本文目的在于学术交流和 R 语言学习,文中分析结果不能直接作为高考填报志愿的依据,特此声明。
代码块1
master_web = 'https://gaokao.baidu.com/gaokao/gkschool/scoreenroll?ajax=1&'
library(curl)
library(jsonlite)
##定义函数
score_fun <- function(query,province,curriculum,batchName){
firstp = curl_escape(query)
secondp = curl_escape(province)
thirdp = curl_escape(curriculum)
fourthp = curl_escape(batchName)
url = paste(master_web,'query=',firstp,'&province=',secondp,'&curriculum=',thirdp,'&batchName=',fourthp,sep="")
web = readLines(url,encoding="UTF-8", warn=F)
rating <- fromJSON(web)
flag = rating$msg
if (flag=="没有符合条件的数据"){
print("Not OK")
}else{
data1 = rating$data$minScoreOrder
if (is.null(data1)==T) {
print("No")
}else{
pos = lapply(data1$value,function(x) x$value[1])
record = data.frame(school=query, year = data1$key,score=unlist(pos))
}
}
}
代码块2
##省份循环
setwd("D:\\school_choose") #设置工作路径
#考生相关信息
curriculum="理科" #根据考生实际情况修改:文科或理科
batchName="本科一批" #根据考生实际情况修改:本科一批或本科二批
province = "福建" #根据考生实际情况修改:考生所在省份
files = list.files(pattern=".csv")
for (i in 1:length(files)){ #省份循环
filename1 = substr(files[i],1,nchar(files[i])-4)
filename = paste("D:\\school_choose\\result\\",filename1,"_run",".csv",sep="")
listresult = list()
dataf = read.csv(files[i],stringsAsFactors = F)
query = dataf$name
for (j in 1:length(query)){ #省份内学校循环
print(query[j])
listresult[[j]] = score_fun(query[j],province,curriculum,batchName)
}
lresult = Filter(function(x) {is.null(nrow(x))==F}, listresult)
allresult = do.call(rbind,lresult)
write.csv(allresult,file=filename,row.names=F)
print(paste(filename1,"done"))
Sys.sleep(3)
}
代码块3
setwd("D:\\school_choose\\result")
aim_score = 43783 #根据考生实际情况修改:考生在本省的排名
m_result = list()
files = list.files(pattern=".csv")
for (i in 1:length(files)){
print(i)
file_name1 = substr(files[i],1,nchar(files[i])-8)
mydata = try(read.csv(files[i]),silent = T)
if (length(names(mydata))<=1) {
print("Not qualified")
}else{
#subdata = subset(mydata,year!="Not qualified")
mydata$diff = suppressWarnings(as.numeric(as.vector(mydata$score))) - aim_score
mydata$p_name = file_name1
m_result[[i]] = subset(mydata,diff > 0)
}
}
mlresult = Filter(function(x) {is.null(nrow(x))==F}, m_result)
m_result1 = do.call(rbind,mlresult)
aim_file = paste("D:\\school_choose\\school\\","f_二批",".csv",sep="")
write.csv(m_result1,file=aim_file,row.names=F)
各省本科院校名单
链接:https://pan.baidu.com/s/1hhzeRZjd3Aq6p-lCCX8o8A
提取码:1v2x
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD