VB编程助力高考志愿填报
编程爱好者
编者按:高考结束了,广大考生在获知成绩前都忙着分析自己应填报的志愿吧!新浪网的高考信息库http://edu.sina.com.cn/college/index.shtml相信也是很多考生常光顾的网站,其中的“高校往年分数线查询”对考生很有参考价值(图1)。但该网站数据库无法一次查询出某省市某年所有高校的录取分数线,如果一个一个地选择高校查询,三天三夜也查不完!下面教大家用程序来解决这个问题。

本文程序下载地址:http://www.cpcw.com/xz/gaokao.rar
解决思路:用程序获取网站数据库资料,分类整理后按格式输出
一、网站数据分析
要拿到新浪该板块的数据库比登天还难,还是换个思路吧!启动“Winsock Expert”监听工具,在提交查询时进行抓包,将抓取的参数去繁就简,得到了一个URL地址:“http://exam.edu.sina.com.cn/collegedb/frame_score.php?provid=1&collegeid=1”,执行后的效果如图2,其中的“provid”是各省市的值,范围在1-32之间,而“collegeid”则是高校的ID值,经过测试后发现,其值的范围在1-700之间(也就是说新浪收录了近700所高校)。如果“Provid”固定为某个值,如1(北京),只要更改后面的“collegeid”值,所显示的就是该高校在北京的历年分数线。根据这个规律,用For循环从1读至700,然后在循环过程中,将这些高校的历年分数线截取出来,不就可以了吗?

先来分析一下图2的源代码,在科目上,有理科和文科之分;在年份上,有2005年、2004年和2003年(有些高校包含2002年);而在某一年内,还有最低分、平均分和投档分这三种类型。虽然有些复杂,但还是有规律的。
二、设计窗体
下面我们就开始编程,启动VB6.0,创建一个“标准 EXE”,在其中创建以下控件。
TEXT控件:
UrlTxt、TEXT值:http://exam.edu.sina.com.cn/collegedb/frame_score.php?provid=1&collegeid=
JieGuo、ScrollBars值:2-Vertical;Multi
Line值:True,用于分行显示结果。
YuanMa、ScrollBars值:2-Vertical;MultiLine值:True,用于存放网页源代码。
SchoolTxt、Text值:"#A752B9"> ;Visib
le值:False,存放查找学校名称的关键字。
CityTxt、Text值:"#FB9608"> ;Visible值:False,存放用户所在省市的关键字。
ChaXun、Text值:"#316B84"> ;Visible值:False,存放查找历年成绩的关键字,在源代码中,不论是文理科,还是年份,或是分数类型,均采用这一个关键字。
Year()、Text数组控件,Year(0)的Text值:2005;Visible 值:False。Year(1)的Text值:2004;Visible 值:False。Year(2)的Text值:2003;Visible 值:False。
StartTxt、Text值:1,设置学校ID的起始值。
EndTxt、Text值暂设为10,是用于设置查询学校ID的终止值。
Command控件:
Command1、Caption值:获取分数。
搭建完成后的样式如图3。

三、输入源代码
接下来输入源代码:
'起初采用Inet控件来获取URL中的源代码,但在运行后,却屡屡出现错误,经过一番网上搜索,找到了一个具有同样功能的API函数URLDownloadToFile。
Private Declare Function URLDownloa
dToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Private Sub Form_Load() '在窗体加载时,引入如下变量
Dim Where2 '定义where2变量,用来存放在Yuanma中所对应字符的所在位置
Dim Where1 '定义where1变量,用来存放在单项截取中所对应字符的所在位置
Dim Startme As Integer '定义一个数值,记录每次查询到的位置
Dim Url As String '存放赋值后的网页URL
Dim Yihang As String '存放截取时的变量
Dim TxtTmp As String '存放单个项目截取时的变量
End Sub
'--------------------------
Private Sub Command1_Click() '执行过程
On Error Resume Next '容错语句
Command1.Caption = "获取中......" '更改命令按钮名称
JieGuo.Text = "" '清空结果
For d = StartTxt.Text To EndTxt.Text'开始执行从StartTxt.Text到EndTxt.Text的循环
YuanMa.Text = "" '清空源代码窗体中的内容
Url = UrlTxt.Text & Str(d) '获得URL地址.
'............
'中间代码见下载文档......
Startme = YuanMa.SelLength + YuanMa.SelStart + 1
Next a
Else
Yihang = Yihang & ";" & ";" & ";" & ";" '如果不存在所对应的年份,则赋空值。这样做的目的是为了让数值在EXCEL的列中相对应
End If
Next b
Next c
End If
If JieGuo.Text = "" Then
JieGuo.Text = Yihang & vbCrLf
Else
JieGuo.Text = JieGuo.Text & Yihang & vbCrLf '在每次的显示结果后加入回车和换行标志
End If
Next d
Command1.Caption = "获取分数" '查询完毕,将命令按钮标题更改为“获取分数”
End Sub
OK,源代码书写完毕,运行一下,为了能很快的看到结果,将结束ID设置为10,“provid”的值仍为1,查询部分高校在北京的录取分数线,还没用半分钟,就得到了结果,如图4。

四、将数据导入Excel
程序运转正常,在之前测试学校ID时,发现新浪收录了699所高校,如果一次性全部查询,担心文本框的承受能力,还是分两次执行吧。先在EndTxt输入400,也就是五六分钟的时间,这些数据就全部查询1存的那个文本文件,在“文本导入向导”步骤之1中选择“分隔符号”,然后点“下一步”进入步骤2,将分隔符号中的“分号”打上对钩,如图5,然后点“下一步”进入步骤之3窗口,完成文本导入。

也许不少朋友会问:“能不能查询某个高校在各省市的录取分数线呢?”当然能了,比如我们查询“清华大学”在各省市的录取分数线(其collegeid为1),只要将“URL”中的内容更改为:“http://exam.edu.sina.com.cn/collegedb/frame_score.php?collegeid=1&provid=”,然后在“EndTxt”中输入32,点“获取分数”就能得到“清华大学”在各省市的录取分数线了。