最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,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. 机器学习读书会的分享 - Reinforcement Learning: An Introduction 第4-6章

    我在机器学习读书会的分享slides,关于DP.MC.TD方法: https://mp.weixin.qq.com/s/r8wZw4iZwFCz0nnakutY3Q 内容如下:

  2. Gym 101055A 计算几何,暴力

    http://codeforces.com/gym/101055/problem/A 题目:给定一些三维空间的点,要你找一个平面,能覆盖尽量多的点,只要求输出点数即可.n<=50 因为数据量小, ...

  3. Notepad++代码函数快速提示设置

    设置——首选项——自动完成

  4. 客户端设置WebService调用超时时间

    刚接触WebService,对如何在客户端设置WebService调用超时时间查阅了一些资料,现总结如下: ============================================== ...

  5. EL_JSTL

    EL(Expression Language)EL表达式 作用:在JSP中消灭java代码 语法: "${ }" 用法:参考jsp页面 //Servlet中,: User user ...

  6. 微信小程序tabBar 不显示底部菜单的原因和解决方法

    1,书写,正确书写时tabBar,不要写成tabbar!!! 2,当创建新工程时,app.json中Pages配置是这样的 ,,[图1], 注意:微信小程序里面的json文件时不能注释的,图中只是给读 ...

  7. jquery中的置顶,置底,向上,向下的排序功能

    css .selectedLi{background: #f0ad4e;color:#fff;} html部分 <ul class="seetSelect2" id='sys ...

  8. C# 获取文件夹下所有的文件

    static void getAllFileNameInDir(string path, ref List<string> files) { DirectoryInfo folder = ...

  9. 「转」sqlalchemy 0.9.8 多对多级联删除

    转自知乎 http://www.zhihu.com/question/21050551 有 A,B,C,AB,AC五张表 class A(base): __tablename__ = "a& ...

  10. 远程登录事件ID

    4672.4624 删除本机记录 HKEY_CURRENT_USER \ Software\Microsoft  \ Terminal ServerClientDefault: 删除“此电脑\文档”下 ...