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

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

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

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

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

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

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

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

public static List<NewTrain> getmsg(String startCity,String endCity,int isAdult) throws Exception{

        List<NewTrain> trains = new ArrayList<NewTrain>();

        String sstartCity = CityCode.format(startCity);
String sendCity = CityCode.format(endCity); TrustManager[] tm = {new MyX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
String type = "ADULT";
if(isAdult == 1){
type = "0X00";
} String urlStr = "https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes="+type+"&queryDate=2014-04-27&from_station="+sstartCity+"&to_station="+sendCity; URL url = new URL(urlStr); HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(ssf); InputStreamReader in = new InputStreamReader(con.getInputStream(),"utf-8"); BufferedReader bfreader = new BufferedReader(in); StringBuffer sb = new StringBuffer(); String line = ""; while ((line = bfreader.readLine()) != null) {
sb.append(line);
}
System.out.println(sb.toString());
}

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

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

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

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

public class NewTrain {

    private String to_station_name;    //到达地

    private String station_train_code;  //火车编号

    private String from_station_name;  //出发地

    private String start_time;   //出发时间  

    private String arrive_time;  // 到达时间

    private String lishi;  //  需要时间

    private String zy_num;  //   一等座数量

    private String ze_num;  //  二等座数量

    private String swz_num;  //   商务座数量

    private String gr_num;  //   高级软卧数量

    private String rw_num;  //  软卧数量

    private String rz_num;  //   软座数量

     private String yw_num;  //   硬卧数量

    private String yz_num;  //   硬座数量

    private String tz_num;  //   特等座数量

    private String wz_num;   //   无座数量
}

接下来的工作就很简单了,将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. java防止表单重复提交的几种方法

    转载大神 1. 使用session同步和token机制来防止并发重复提交 https://blog.csdn.net/hejingyuan6/article/details/50487777 2. S ...

  2. Selenium----Selenium简单介绍以及Selenium IDE环境搭建,脚本录制

    1.selenium简单介绍 心得:作为一个新手开始了解这个工具,打算从录制脚本开始学习,“录制,看,学习,写”,总结网友说得打算先使用Selenium IDE录制学习,再使用Selenium RC开 ...

  3. Oracle权限管理

    一)用户Oracle中的用户分为二大类1)Oracle数据库服务器创建时,由系统自动创建的用户,叫系统用户,如sys.2)利用系统用户创建的用户,叫普通用户,如scott,hr,c##tiger,zh ...

  4. OC与JS交互前言

    OC与JS交互过程中,可能会需要使用本地image资源及html,css,js文件,这些资源应该如何被加载? 一.WebView加载HTML UIWebView提供了三个方法来加载html资源 1.  ...

  5. JAVA中面向对象

    一.方法: 1.方法概述: 在JAVA中,方法就是用来完成解决某件事情或实现某个功能的办法. 2.方法的语法格式: 修饰符  返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,.....){ ...

  6. jar 压缩 解压 war包

    Win+R 输入cmd进入命令行,进入到源码所在目录.所用工具,jdk自带的jar.exe 打包命令:jar -cvf xxx.war * 解包命令: jar -xvf xxx.war * 参数 说明 ...

  7. httpclient通过post提交到webapi

    var client = new HttpClient(); var url = BASConfig.Instance.SiteSettingsModule.SyncWorkLogAppUrl; va ...

  8. 在Magento中用MySQL模拟队列发送电子邮件

    1. 需求 顾客在网站上购买特定商品并且这些商品的总金额超过特定金额后,使用email给顾客发送一个优惠券:假如某件商品已经降价了,则此商品的金额不计算在目标总金额内: 2. 需求分析 ①发送优惠券的 ...

  9. Pixel XL 刷机及Root详细方法

    需要准备的文件: 获取 Google USB 驱动程序并安装 https://developer.android.com/studio/run/win-usb 下载Google官方镜像文件 [8.1. ...

  10. Localroast使用总结

    全手打原创,转载请标明出处: https://www.cnblogs.com/dreamsqin/p/10883248.html,多谢~=.= 什么是Localroast 一个根据 JSON 文件快速 ...