java抓取12306信息实现火车余票查询示例_java

最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,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获取中文站名对应的字母的组合,有一些可能不全

时间: 2024-09-20 07:44:30

java抓取12306信息实现火车余票查询示例_java的相关文章

PHP火车余票查询的API,12306官方的API

我在做自己微信的时候需要的火车票查询的东西,注册的东西等等太多了,今天就简单的做了下测试看能获取到不,数据怎么样处理速度怎么样,因为是个人做所以就没有去其他网站上找接口,就自己做了下!下边把方法放出来!   <?php /** *火车票查询方法 简单尝试 * * @copyright widuu * @license http://www.widuu.com * @lastmodify 2013-6-20 */ function json_array($json){ if($json){ for

“火车余票查询”成挂马热词

□据新华社报道 春运开始以来,"火车余票查询"成为搜索热词.据金山云安全监测中心数据显示,目前监测到含"火车余票查询"等相关信息的网站被挂马数量呈上升趋势,仅2月1日一天就有1000家左右网站被挂马. 金山毒霸安全专家李铁军提醒广大用户,网上订票或者查询一定要到正规的订票网站,事先确认网站的地址准确无误,切忌轻易相信网络上的中奖信息,对于一些需要输入个人网银账号.密码的行为需高度警惕.目前大部分病毒是通过网页挂马的形式来感染用户,因此建议用户一定要养成良好的网络使用

使用java 抓取微信公共账号信息

问题描述 如何使用java抓取微信公共账号信息,有哪位大神能提供思路,要是有源码就更好了,有谁实现了么如何使用java抓取微信公共账号信息,有哪位大神能提供思路,要是有源码就更好了,有谁实现了么 解决方案 解决方案二:网络搜搜应该还是有解决方案的吧.

ajax-请问关于java 通过http client抓取网页信息返回:请开启JavaScript并刷新该页

问题描述 请问关于java 通过http client抓取网页信息返回:请开启JavaScript并刷新该页 初学httpClient,想去抓取某个网页查询出来的结果信息,通过浏览器监控发现response出来的信息和java控制台打印出来的不一样. package com.test; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import

java 抓取cd音轨 open resource

问题描述 在谷歌上查遍了.找到一些C++写的CDex,还有一个Java写的jripper但是不支持windows系求高手指点..Windows上java抓取cd音轨(转成mp3格式)的开源工具谢谢 解决方案 解决方案二:该回复于2011-04-25 16:02:52被版主删除解决方案三:没人回复唉解决方案四:刚看了好多人问了这样的问题,,无解啊解决方案五:jripper可以运行在window系统中解决方案六:jripper的代码我改了些可以显示cd信息抓取音轨还要努力解决方案七:jripper是

html-如何用java抓取网页隐藏音频链接

问题描述 如何用java抓取网页隐藏音频链接 我想用java抓取荔枝FM网站上所有的音频文件,但是直接查看网页源码发现找不到页面的音频链接http://www.lizhi.fm/#/25734/20075765977745926,但是我用谷歌的Developer Tools能找到这个链接http://cdn.lizhi.fm/audio/2015/05/16/20075765977745926_hd.mp3,我有点不知道怎么搞了,求帮忙看看什么情况 解决方案 搜索这个页面的data-url 解决

java爬虫-请求一个url,用java抓取所有网页链接以及内容。

问题描述 请求一个url,用java抓取所有网页链接以及内容. 比如用这个当实例:http://roll.news.sina.com.cn/news/gnxw/gdxw1/index.shtml.(新手,望多多关照) 解决方案 通过java.net.URL类抓取某个网页的内容java-抓取指定URL网页的内容 解决方案二: http://roll.news.sina.com.cn/news/gnxw/gdxw1/index.shtml这个网址下面有好几个子链接网页,有好几页,要求全部抓到.. 解

各位高手们,我想抓取新闻信息到数据库中,求指教

问题描述 各位高手们,我想抓取新闻信息到数据库中,求指教 各位高手们,我想抓取新闻信息到数据库中,求指教,麻烦加我QQ交流一下 解决方案 最好是能用asp能写出来 解决方案二: 可以跟你说说我的思路,后边你可以自己完成: 1.先获取新闻页面的html 代码 2. 通过正则表达式 获取你想要的内容 解决方案三: 百度火车头采集,很好用的采集软件 自己写要分析新闻页面内容,前后截取了,asp下载网页DEMO:asp xmlHttp用法举例 解决方案四: js等抓去html页面内容. 分析DOM类容

JAVA抓取网页的图片

import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /