以2018年1月25日G73次列车到达长沙南站的正晚点时间查询为例

第一步,去12306官网找到正晚点查询的入口

第二步,Chrome浏览器下F12打开控制台

第三步,按要求填写需要的参数,发起一次请求

第四步,F12控制台的Network分类下有这次发起请求的记录

第五步,双击就可以查询了,看起来那个验证码是前端做的验证

扩展:

下面来解析一下这个请求吧

http://dynamic.12306.cn/mapping/kfxt/zwdcx/LCZWD/cx.jsp?cz=%B3%A4%C9%B3%C4%CF&cc=g73&cxlx=0&rq=2018-01-25&czEn=-E9-95-BF-E6-B2-99-E5-8D-97&tp=1516868331709

可以看到包含以下几个参数:

1.  cz=车站   .....(吐槽一句,我以为这种巨型系统会脱离我这种菜鸟才会用的命名法的).....

我知道这一串 %B3%A4%C9%B3%C4%CF 是 长沙南 的意思,但不知道是哪种编码,我就去站长之家找,UTF-8、Unicode、URL一个个试过去,最后确定是URL编码,解析地址是URL编码解码-站长工具。需要注意的是,这个下拉列表框里选中gb2312。

2. cc=车次

3. cxlx=0  查询路线?我也不知道,但是试了一下,只有为0或者1才能查到数据,不然就是

4. rq=日期 格式为 2018-01-25

5.czEn=-E9-95-BF-E6-B2-99-E5-8D-97  车站编码?我也不知道,但是这个参数删了会报错

(2018-01-26更新)测试发现这个参数必须填的,但是各种解码方式都无法解析,顿时感觉人生都灰暗了,我以为是

12306自己的数据字典,就去查看了12306网页的源码,一步一步往下走:

html:

<inputtype="button"tabindex="6"class="btn1"value=" 查 询" name="chaxunBtn"id="chaxunBtnId"onClick="chaxunFun()" />

js:

function chaxunFun(){//查询按钮的事件处理var resultJsp = document.getElementById("resultJsp");showResult(0,1);resultJsp.innerHTML = "";var chezhanInput = document.getElementById("chezhanInId");if(chezhanInput.disabled==false){if(chezhanInput.value==""){alert("错误提示:\n\n请输入车站信息!");chezhanInput.focus();return;}else{chezhanInput.value = chezhanInput.value.replace(/\s+/g,"");}}var chechiInput = document.getElementById("chechiInId");if(chechiInput.value==""){alert("错误提示:\n\n请输入车次信息!");chechiInput.focus();return;}else{chechiInput.value = chechiInput.value.replace(/\s+/g,"");}//**** add by hjl 2008-12-23var rightcode="";for(var i=0;i<spans.length;i++){rightcode+=spans[i].innerHTML;               }       if(document.getElementById("yzm").value!=rightcode){//stono 90302 start      alert("验证码不正确,请重新输入!");document.getElementById("yzm").focus();return false;//stono 90302 end}//************************************************************document.getElementById("resultJsp").innerHTML="正在查询,请稍候...";//checkCZ();fromtoFun();}
function fromtoFun(){//检测车站车次var cz=document.getElementById("chezhanInId").value.replace(/\s+/g,"");var cc=document.getElementById("chechiInId").value.replace(/\s+/g,"");var czEn = encodeURI(cz);//stono 90302czEn = czEn.replace(/%/g,"-"); //stono 90302var cxlx =0;var cxlx0 = document.getElementById("cxlx0");if(!cxlx0.checked) cxlx=1;var rq= document.getElementById("txt2").value;if(cc==""){document.getElementById("from2Id").innerHTML="";return ;}// alert('from2.jsp?cz='+cz+'&cc='+cc+'&cxlx='+cxlx+'&rq='+rq+'&czEn='+czEn);var tp = new Date().getTime();var from2 = new net.ContentLoader('from2.jsp?cz='+cz+'&cc='+cc+'&cxlx='+cxlx+'&rq='+rq+'&czEn='+czEn+'&tp='+tp,fromtoCall);}
var cz=document.getElementById("chezhanInId").value.replace(/\s+/g,"");
var czEn = encodeURI(cz);
核心代码就是这两句啦,但是令我非常不理解的是,在“cz”这个参数这里,编码格式是GB2312,具体过程是“长沙南”-->以GB2312的格式Urlcode编码-->“%b3%a4%c9%b3%c4%cf”,而在“czEn”这个参数里,编码格式是utf-8,具体过程是“长沙南”-->以utf-8的格式进行Urlcode编码 -->“%e9%95%bf%e6%b2%99%e5%8d%97”-->将“%”替换为“-”。

6. tp=timestamp  时间戳,至于为什么取前后两个字母,大概是心情命名法吧,这里也有转码地址时间戳转换地址-站长工具。

这个参数乱填一个数字甚至不填也可以请求到,应该是用于统计分析?

那么要发起一个正晚点查询的请求只要在URL地址   http://dynamic.12306.cn/mapping/kfxt/zwdcx/LCZWD/cx.jsp?    后面拼接需要的参数就行了,至于用途,大概就是有时候列车晚点的时候能方便一点查询到晚点信息而不用每次去12306输验证码查询了吧

总结:学到了什么

1. JS encodeURI      replace 函数的使用

2.  从F12的控制台可以获取到很多信息,比如这篇文章用到的网路请求地址,参数

3. 看起来很厉害的网站其实慢慢看下去也能看懂

4. 命名真的要规范化,不然就会像12306这样,查询=chaxun()

5. 学点东西心情会变好

6. 感兴趣的事值得深究

扩展练习:写一个简单的html页面,要求包含12306正晚点查询的功能

12306发起正晚点查询请求相关推荐

  1. 12306之余票查询流程解析

    前言 本套教程共分3章: 12306之登录流程解析 12306之余票查询解析 12306之下单流程解析 本套内容主要用于分析12306购票流程,意在编写一套自动购票小程序.12306接口 api 经常 ...

  2. 12306火车余票查询

    测试地址:http://gengjian.24.lc/japson/123060.htm 调用12306官网的查询接口. 123060.htm 火车票余票查询Demo By Genng.<br& ...

  3. 12306实时余票查询接口

    12306实时余票查询接口代码文档及返回示例,可查询实时火车票余票,包括车次.车次始发站.车次终点站.出发时间.到达时间.车次类型.总历时时间等等. 接口名称:12306实时余票查询接口 接口平台:聚 ...

  4. 12306火车车次票价查询api

    12306订票接口-火车车次票价查询api代码文档及返回示例分享,可查询查询车次返回的车次信息查询票价,支持列次编号.出发站名称.到达站名称等查询. 接口名称:火车车次票价查询api 接口平台:聚合数 ...

  5. Python爬虫----12306火车票余票查询器

    12306火车票余票查询器 文章同步更新:http://www.riba2534.cn/?p=305 今天写了一个12306火车票余票查询器的爬虫,在这里记录一下过程. 首先先看一下最终效果: 比如想 ...

  6. mysql查询过程从客户端发送查询请求_MySQL查询过程和高级查询

    最近有个需求,要修改现有存储结构,涉及查询条件和查询效率的考量,看了几篇索引和HBase相关的文章,回忆了相关知识,结合项目需求,说说自己的理解和总结. 总体目录如下,上篇介绍了前3小节,分析了索引为 ...

  7. gp如何处理查询请求

    [查询计划和调度] 查询处理顺序: 1. 用户查询请求 2. Master(解析sql.优化sql) 3. Master把任务分配到各个Segment执行 4. 每个segment负责查询自己本节点数 ...

  8. Influxdb中Select查询请求结果涉及到的一些数据结构

    女主宣言 本文将给大家介绍的是在Influxdb中Select查询请求结果中涉及到的一些数据结构,对于Influxsql的查询语句不太熟悉的同学,可以在先了解了解: https://docs.infl ...

  9. php 向py发起请求,Python向PHP发起GET与POST请求

    CloudBean项目中到PHP开发WEB管理端,用Python开发服务控制端,在项目中Python的服务控制端有时候需要主动连接PHP的WEB管理端下载或上传配置参数或数据信息,这里采用的原理是Py ...

最新文章

  1. 在 iOS 应用中实现飞行模式提醒
  2. 加载Hadoop+spark镜像文件需要修改的配置文件
  3. netbeans缺少java文件夹_Java,如何在netbeans中添加库文件?
  4. IDEA Maven创建多个Module相互依赖
  5. 鸿蒙手机系统还没有开发,华为鸿蒙手机太难了!引发开发者大吐槽:为何没有自己独特风格?-互联网/电商-文章-小虾米...
  6. 六大举措深耕光通信市场
  7. 大规模分布式系统资源管理(二)
  8. JAVA 定义全局常量码表_【Java基础】java常量是什么?
  9. linux export 生效_Linux之提高命令行的工作效率
  10. 【算法】删去k个数字后的最小值
  11. M1 Max 暴击,倚天补刀
  12. Google Health将被解散,谷歌为何折戟于医疗健康?
  13. mschart走势图 vc_[VC] 解决MSChart闪烁的问题
  14. java timer demo_java中任务调度java.util.Timer,ScheduledExecutor,Quartz的机制说明和demo代码实例分享...
  15. 基于layui 下拉多选 三级联动省市区demo
  16. SMCJ系列TVS瞬态抑制二极管型号参数表
  17. 动态规划算法典型应用之背包问题
  18. 刷题、OJ 1337: 运动员分组
  19. 微信小程序下拉框的实现功能
  20. C#中五个序列聚合运算(Sum, Average, Min, Max,Aggregate)

热门文章

  1. 焊缝标注vlx实用程序_常用焊缝符号及其标注方法
  2. Java 使用iText7生成带页码的PDF文件(同时生成目录,但是不会合并两个PDF)
  3. 文本溢出时,如何显示为省略号
  4. 图像--RAW格式理解
  5. 五分钟秒懂机器学习混淆矩阵、ROC和AUC
  6. Java线上故障解决方案
  7. iOS调试工具—Instruments
  8. PasswordEncoder
  9. Android 10 网络权限
  10. 我的HIFI WAV播放器设计之一