这两天闲来无事,学习了一些关于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相关推荐

  1. 自己动手写一个印钞机 第四章

    2019独角兽企业重金招聘Python工程师标准>>> 作者:阿布? 未经本人允许禁止转载 ipython notebook git版本 目录章节地址: 自己动手写一个印钞机 第一章 ...

  2. .sql文件_自己动手写SQL查询引擎

    自己动手写SQL查询引擎 起因 笔者在实际工作中经常需要解析文件,每次文件稍有变化,都得拷贝粘贴一堆代码. 于是就想着能不能做一个通用的服务,通过配置的方式解析文件. 配置通用 最通用的方法就是自己定 ...

  3. 自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用...

    自己动手写一个推荐系统 废话: 最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来. 在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并 ...

  4. 自己动手写一个简单的bootloader

    自己动手写一个简单的bootloader 15年10月31日19:44:27 (一) start.S 写这一段代码前,先要清楚bootloader开始的时候都做什么了.无非就是硬件的初始化,我们想要写 ...

  5. 自己动手写一个分库分表中间件(三)数据源路由实现

    相关文章: 自己动手写一个分库分表中间件(一)思考 自己动手写一个分库分表中间件(二)数据源定义和分片代理层设计 排查项目中读写分离失效原因 小议 Java 内省机制 注:本文内容暂不涉及事务相关的问 ...

  6. 自己动手写一个印钞机 第一章

    2019独角兽企业重金招聘Python工程师标准>>> 作者:阿布? 未经本人允许禁止转载 ipython notebook git版本 目录章节地址: 自己动手写一个印钞机 第一章 ...

  7. 自己动手写一个仿Docker虚拟容器

    自己动手写一个仿Docker虚拟容器 本项目参照书籍<自己动手写Docker> 作者:陈显鹭(花名:遥鹭)-阿里云高级研发工程师等 项目地址:https://gitee.com/Sheng ...

  8. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  9. Spring Boot 动手写一个 Start

    我们在使用SpringBoot 项目时,引入一个springboot start依赖,只需要很少的代码,或者不用任何代码就能直接使用默认配置,再也不用那些繁琐的配置了,感觉特别神奇.我们自己也动手写一 ...

最新文章

  1. Spring Cloud Alibaba 消息队列:基于 RocketMQ 实现服务异步通信
  2. 系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)
  3. 超图桌面版制作分段专题图学习
  4. 在天气预报中应用机器学习
  5. Android Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
  6. react leaflet_如何使用Leaflet在React中轻松构建地图应用
  7. OpenHarmony开源项目
  8. 通过Java反射获取对象上的注解,java反射注解妙用-获取所有接口说明
  9. eclipse 最全快捷键(网络收集)
  10. [引]SQL帮助文档:使用 WAITFOR 使SQL语句停顿后执行
  11. php加skplayer,WordPress免插件集成ckplayer播放器
  12. 扫码枪WinForm程序的编写
  13. html form提交heard,德普前妻Amber Heard戛纳合辑
  14. 序列化和反序列化 加上json数据流转换
  15. NYOJ 144 小柯的烦恼
  16. 根据三个点的坐标计算三角形面积
  17. Netflix继续开源,更多猴子进入视野
  18. python上方菜单栏不见了_python tkinter-菜单栏
  19. C Clion开发工具注册码
  20. PHP处理CODE128C条形码数据为标准的打印机ESC指令

热门文章

  1. 全平台安卓源码预置GMS方法 / 全平台安卓源码预置谷歌服务方法
  2. 代码审计--2--认证会话管理(上)
  3. PCL-surface/on_nurbs模块分析
  4. Java中文件操作和IO
  5. linux磁盘文件恢复,Linux 数据恢复
  6. stm32f407探索者+HAL库+FreeRTOS +FreeRTOS_TCP/IP 移植
  7. Unity SKFramework框架(二十三)、MiniMap 小地图工具
  8. Facebook的亚洲战略:没有中国 怎算是连接了世界
  9. “戏”说设计模式——模板方法模式
  10. xhr如何发送post请求_xhr 或 jQuery ajax, Post 请求如何获得 303 状态的返回结果