自己动手写一个查询cet成绩的API
这两天闲来无事,学习了一些关于php的curl相关的内容,并利用curl和simple_html_dom做了一个查询cet成绩的API,在这了分享出来。
我利用的是学信网的查询地址。http://www.chsi.com.cn/cet/,可以看到,我们需要根据准考证号和姓名来进行查询,幸运的是,它不需要用验证码,但不知道它的后台是用post还是get方式来接受,所以,先输入一个数据查询一下来看,
点击查询,如果你的输入都正确,我们将会看到我们要查询的结果页面,先看地址栏:
可以看到,后台是采用get方式来接收的,所以,接下来事情就很好办,我们的API只需要接受name(姓名)与num(准考证号)两个参数。
所以会有如下代码:
$zkzh=$_GET['num'];
$xm=$_GET['name'];
接下来,构造查询地址:
$curlPost='zkzh='.$zkzh.'&xm='.$xm;
$ch = curl_init("http://www.chsi.com.cn/cet/query?".$curlPost) ;
声明一个数组用来存储我们一会要捕获的数据。
$arrMsg = array();
重头戏来了,我们接下来就试着用curl来捕获刚才我们构造的url地址。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回 curl_setopt($ch, CURLOPT_HEADER, 1);$output = curl_exec($ch) ; $html = new simple_html_dom();$html ->load($output);echo $html;
如果对刚才的这段代码不太理解则建议先看一些curl的相关内容,这个代码的意思是获得刚才我们构造的url地址的html页面,正常情况下,它的输出应该和我们最开始在官网上的查询返回的页面是一样的,(其实理解很简单,url地址都是一样的吗,只不过这里我们会获得整个html页面的源码并存于$html中),但是很悲剧,返回的页面如下:
可见学信网对访问来源做了限制,但是这没什么,curl是很强大的,它可以构造虚拟的访问来源,代码如下:
curl_setopt($ch, CURLOPT_REFERER, "http://www.chsi.com.cn/cet/ ");
最后,整合一下代码如下:
<?php
include('simple_html_dom.php');//引入simple_html_dom文件
$zkzh=$_GET['num'];
$xm=$_GET['name'];
//$zkzh = '4300221312*****';//准考证号
//$xm = '**';//姓名
$curlPost='zkzh='.$zkzh.'&xm='.$xm;
$ch = curl_init("http://www.chsi.com.cn/cet/query?".$curlPost) ;
$arrMsg = array();
for($i=0;$i<15;$i++)
{curl_setopt($ch, CURLOPT_REFERER, "http://www.chsi.com.cn/cet/ "); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回 curl_setopt($ch, CURLOPT_HEADER, 1);$output = curl_exec($ch) ; $html = new simple_html_dom();$html ->load($output);echo $html;
}?>
运行上面的代码返回页面如下:
好的,因为缺少学信网的css文件,所以布局会乱掉,但这不会影响后续操作,如果你的操作和我一样,效果也一样,那么第一步就完成啦!
一鼓作气,接下来,我们其实要的数据不多,只有姓名,学校,总分等信息,所以就要从$html这个字符串中提取出这些信息。在chrome浏览器下按f12进入开发者模式,找到我们需要数据的位置,
会发现我们需要的数据都被<td>标签包裹,所以采用simple_html_dom来进行操作:
foreach($html->find("td") as $m){array_push($arrMsg,$m->plaintext);}
幸运的是td标签包裹的只有我们需要的数据,所以经过上面的代码,我们会将姓名,学校等数据放进$arrMsg数组,后面的就简单了,只需要按照自己的需求来构造了。
最后,贴出我的版本的完整代码。
<?php
include('simple_html_dom.php');
$zkzh=$_GET['num'];
$xm=$_GET['name'];
//$zkzh = '4300221312*****';//准考证号
//$xm = '**';//姓名
$curlPost='zkzh='.$zkzh.'&xm='.$xm;
$ch = curl_init("http://www.chsi.com.cn/cet/query?".$curlPost) ;
$arrMsg = array();
for($i=0;$i<15;$i++)
{curl_setopt($ch, CURLOPT_REFERER, "http://www.chsi.com.cn/cet/ "); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回 curl_setopt($ch, CURLOPT_HEADER, 1);$output = curl_exec($ch) ; $html = new simple_html_dom();$html ->load($output);foreach($html->find("td") as $m){array_push($arrMsg,$m->plaintext);}$returnArr= array("name"=>urlencode($arrMsg[2]),"school"=>urlencode($arrMsg[3]),"time"=>urlencode($arrMsg[6]),"pro"=>urlencode($arrMsg[4]),"score"=>urlencode($arrMsg[7]));if(!empty($arrMsg)){echo urldecode(json_encode($returnArr));break;}}?>
上面的代码会把我们需要的主要信息以json形式返回,效果如下:
好的,over!刚刚获得了曹冲,要去三国杀一杀啦~~
自己动手写一个查询cet成绩的API相关推荐
- 自己动手写一个印钞机 第四章
2019独角兽企业重金招聘Python工程师标准>>> 作者:阿布? 未经本人允许禁止转载 ipython notebook git版本 目录章节地址: 自己动手写一个印钞机 第一章 ...
- .sql文件_自己动手写SQL查询引擎
自己动手写SQL查询引擎 起因 笔者在实际工作中经常需要解析文件,每次文件稍有变化,都得拷贝粘贴一堆代码. 于是就想着能不能做一个通用的服务,通过配置的方式解析文件. 配置通用 最通用的方法就是自己定 ...
- 自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用...
自己动手写一个推荐系统 废话: 最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来. 在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并 ...
- 自己动手写一个简单的bootloader
自己动手写一个简单的bootloader 15年10月31日19:44:27 (一) start.S 写这一段代码前,先要清楚bootloader开始的时候都做什么了.无非就是硬件的初始化,我们想要写 ...
- 自己动手写一个分库分表中间件(三)数据源路由实现
相关文章: 自己动手写一个分库分表中间件(一)思考 自己动手写一个分库分表中间件(二)数据源定义和分片代理层设计 排查项目中读写分离失效原因 小议 Java 内省机制 注:本文内容暂不涉及事务相关的问 ...
- 自己动手写一个印钞机 第一章
2019独角兽企业重金招聘Python工程师标准>>> 作者:阿布? 未经本人允许禁止转载 ipython notebook git版本 目录章节地址: 自己动手写一个印钞机 第一章 ...
- 自己动手写一个仿Docker虚拟容器
自己动手写一个仿Docker虚拟容器 本项目参照书籍<自己动手写Docker> 作者:陈显鹭(花名:遥鹭)-阿里云高级研发工程师等 项目地址:https://gitee.com/Sheng ...
- java 手编线程池_死磕 java线程系列之自己动手写一个线程池
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...
- Spring Boot 动手写一个 Start
我们在使用SpringBoot 项目时,引入一个springboot start依赖,只需要很少的代码,或者不用任何代码就能直接使用默认配置,再也不用那些繁琐的配置了,感觉特别神奇.我们自己也动手写一 ...
最新文章
- Spring Cloud Alibaba 消息队列:基于 RocketMQ 实现服务异步通信
- 系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)
- 超图桌面版制作分段专题图学习
- 在天气预报中应用机器学习
- Android Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
- react leaflet_如何使用Leaflet在React中轻松构建地图应用
- OpenHarmony开源项目
- 通过Java反射获取对象上的注解,java反射注解妙用-获取所有接口说明
- eclipse 最全快捷键(网络收集)
- [引]SQL帮助文档:使用 WAITFOR 使SQL语句停顿后执行
- php加skplayer,WordPress免插件集成ckplayer播放器
- 扫码枪WinForm程序的编写
- html form提交heard,德普前妻Amber Heard戛纳合辑
- 序列化和反序列化 加上json数据流转换
- NYOJ 144 小柯的烦恼
- 根据三个点的坐标计算三角形面积
- Netflix继续开源,更多猴子进入视野
- python上方菜单栏不见了_python tkinter-菜单栏
- C Clion开发工具注册码
- PHP处理CODE128C条形码数据为标准的打印机ESC指令
热门文章
- 全平台安卓源码预置GMS方法 / 全平台安卓源码预置谷歌服务方法
- 代码审计--2--认证会话管理(上)
- PCL-surface/on_nurbs模块分析
- Java中文件操作和IO
- linux磁盘文件恢复,Linux 数据恢复
- stm32f407探索者+HAL库+FreeRTOS +FreeRTOS_TCP/IP 移植
- Unity SKFramework框架(二十三)、MiniMap 小地图工具
- Facebook的亚洲战略:没有中国 怎算是连接了世界
- “戏”说设计模式——模板方法模式
- xhr如何发送post请求_xhr 或 jQuery ajax, Post 请求如何获得 303 状态的返回结果