最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,12306又没有提供专门的查票的接口。今天突然想起自己直接去12306上查询,抓取查询返回的数据包,这样就可以得到火车票的信息。这里就随笔记一下获取12306余票的过程。

首先,我用firefox浏览器上12306查询余票。打开firefox的Web控制台,选上网络中的“记录请求和响应主体”

然后输入地址日期信息之后点击网页上的查询按钮,就能在Web控制台下看到网页请求的地址了:

就是图片中的第二条,即当你点击查询按钮时,处理该事件的实际地址。点开它可以看到

请求网址,请求头,响应头和响应主体这些东西,响应主体里就是我们需要的火车票信息。

有了这个请求网址了就可以到实际代码中进行操作了。可以发现网址的格式是

前面是处理请求的地址,后面接的参数purpose_codes是指成人票(AADULT),学生票(自己去试试吧),queryDate就是日期,from_station和to_station顾名思义就是出发站和到达站了。这里北京和武汉分别表示为BJP和WHN。

到java代码里就可以直接写https请求来获取火车票信息数据包了

  1. public static List<NewTrain> getmsg(String startCity,String endCity,int isAdult) throws Exception{
  2.  
  3. List<NewTrain> trains = new ArrayList<NewTrain>();
  4.  
  5. String sstartCity = CityCode.format(startCity);
  6. String sendCity = CityCode.format(endCity);
  7.  
  8. TrustManager[] tm = {new MyX509TrustManager()};
  9. SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
  10. sslContext.init(null, tm, new java.security.SecureRandom());
  11. // 从上述SSLContext对象中得到SSLSocketFactory对象
  12. SSLSocketFactory ssf = sslContext.getSocketFactory();
  13. String type = "ADULT";
  14. if(isAdult == 1){
  15. type = "0X00";
  16. }
  17.  
  18. String urlStr = "https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes="+type+"&queryDate=2014-04-27&from_station="+sstartCity+"&to_station="+sendCity;
  19.  
  20. URL url = new URL(urlStr);
  21.  
  22. HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
  23. con.setSSLSocketFactory(ssf);
  24.  
  25. InputStreamReader in = new InputStreamReader(con.getInputStream(),"utf-8");
  26.  
  27. BufferedReader bfreader = new BufferedReader(in);
  28.  
  29. StringBuffer sb = new StringBuffer();
  30.  
  31. String line = "";
  32.  
  33. while ((line = bfreader.readLine()) != null) {
  34. sb.append(line);
  35. }
  36. System.out.println(sb.toString());
  37. }

这段代码的cityCode.format()是自己写的将中文的站名转换为字母组合,下面那几行是关于https请求的。网址就是刚才获取到的网址。这段代码执行后得到的输出内容如下:

很容易看出来这些数据是一条条的json数据(我进行了简单的处理,让他一条条打印出来)。

既然是json数据就好办了。取出一条数据来进行分析就可以分析出来key值代表的意思。我只分析了几个我需要的key值

然后就直接写一个Train类来储存火车票的信息,便于之后显示用了。

  1. public class NewTrain {
  2.  
  3. private String to_station_name; //到达地
  4.  
  5. private String station_train_code; //火车编号
  6.  
  7. private String from_station_name; //出发地
  8.  
  9. private String start_time; //出发时间
  10.  
  11. private String arrive_time; // 到达时间
  12.  
  13. private String lishi; // 需要时间
  14.  
  15. private String zy_num; // 一等座数量
  16.  
  17. private String ze_num; // 二等座数量
  18.  
  19. private String swz_num; // 商务座数量
  20.  
  21. private String gr_num; // 高级软卧数量
  22.  
  23. private String rw_num; // 软卧数量
  24.  
  25. private String rz_num; // 软座数量
  26.  
  27. private String yw_num; // 硬卧数量
  28.  
  29. private String yz_num; // 硬座数量
  30.  
  31. private String tz_num; // 特等座数量
  32.  
  33. private String wz_num; // 无座数量
  34. }

接下来的工作就很简单了,将json数据放入Train类对象中。

好了,基本工作完成了,接下来的工作就是将功能整合到项目里去了。

这其中用到的中文站名跟字母组合的一个txt文件(读txt获取中文站名对应的字母的组合,有一些可能不全,大家有好的资源可以提供给我一下,谢了~)

如果大家需要可以邮件我376751704@qq.com (第一次写这个不知道怎么上传附件~)

java抓取12306火车余票信息的更多相关文章

  1. Python大法之从火车余票查询到打造抢Supreme神器

    本文作者:i春秋作家——阿甫哥哥 系列文章专辑:https://bbs.ichunqiu.com/forum.php?mod=collection&action=view&ctid=9 ...

  2. 12306火车票余票查询&Python实现邮件发送

    查询余票接口 打开12306官网,并进入余票查询页面,同时开启chrome浏览器F12控制台,以北京到上海为例,搜索2018年10月1日的余票信息,点击搜索按钮,可以在控制台发送了一条GET请求,请求 ...

  3. java 抓取网页图片

    import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.Out ...

  4. 如何有效抓取SQL Server的BLOCKING信息

    原文:如何有效抓取SQL Server的BLOCKING信息 转自:微软亚太区数据库技术支持组 官方博客 http://blogs.msdn.com/b/apgcdsd/archive/2011/12 ...

  5. 搜索会抓取网站域名的whoise信息吗

    http://www.wocaoseo.com/thread-309-1-1.html 网站是否在信产部备案,这是不是会成为影响网站收录和排名的一个因素?百度是否会抓取域名注册人的相关whois信息吗 ...

  6. Java爬取12306余票

    一.前言 今年国庆和中秋一起放,虽然很欢快,但是没有票了!!! 于是自己倒腾了一个查询余票的小程序. 二.准备工作 1.先打开12306的页面 2.然后右键检查,点network 3.再点一下1230 ...

  7. java抓取网页数据,登录之后抓取数据。

    最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一 ...

  8. Java抓取网页数据(原网页+Javascript返回数据)

    有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同! 本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据:(2)抓取网页Javascript返回的数 ...

  9. java抓取动态生成的网页

    最近在做项目的时候有一个需求:从网页面抓取数据,要求是首先抓取整个网页的html源码(后期更新要使用到).刚开始一看这个简单,然后就稀里哗啦的敲起了代码(在这之前使用过Hadoop平台的分布式爬虫框架 ...

随机推荐

  1. 联想电脑Fn+F6禁用触摸板功能不管用

    我的原因是电脑没有安装触摸板驱动,解决方法:去联想官网根据自己的主机编号下载适合自己的触摸板驱动,安装重启即可解决

  2. Oracle的表创建和事务管理

    Oracle的表创建和事务管理 - CURD,根据查询结果创建新表 - 事务管理 - 什么是事务 ,为什么要用事务 - SQL99事务隔离级别 - Oracle事务隔离级别 - 事务回滚 - 隐式回滚 ...

  3. 八个cmd 命令

    一,ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP ...

  4. Ashx登录

    <script type="text/javascript"> window.onload = function () { var url = document.get ...

  5. 【练习笔记】spring 配置Schedule

    spring项目一些简单的定时任务可以通过@Schedule注解来实现,具体配置如下 在applicationContext.xml文件中增加配置 1.引入task约束 xmlns:task=&quo ...

  6. springboot 学习笔记(六)

    (六)springboot整合activemq 1.现下载activemq,下载链接:http://activemq.apache.org/download.html,windows系统解压后进入bi ...

  7. Linux下安装JDK及相关配置

    1.官网下载JDK:选择Linux压缩包进行下载 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213 ...

  8. JavaScript中函数声明和函数表达式的区别

    声明一个函数: var x=1; foo(); function foo() { console.log(x);//1 } myfun();//报错 定义一个函数表达式: var myfun=myfo ...

  9. 【干货】JavaScript DOM编程艺术学习笔记7-9

    七.动态创建标记 在文档中不写占位图片和文字代码,在能调用js的情况下动态创建,文档支持性更好. 在原来的addLoadEvent prepareGallery showPic的基础上增加函数prep ...

  10. php 01

    PHP 一.了解php 1.什么是php PHP 超文本预处理器 服务器端的脚本语言  是一种被广泛应用的开放源代码的多用途脚本语言  他可以嵌入到html中 尤其适用web开发 2.php在web中 ...