最近项目比较闲,闲来无事,参照网上的代码实现了一下抓取12306数据包查询余票的代码,

需要的jar包需要全部包含到项目下,代码测试OK,具体代码如下:

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class TestTmp {
/**
 * @params args
 * @return void
 */
public static void main(String[] args) throws Exception {

//运行该代码前需要生成证书文件放到jre的security目录下,具体操作参照
//http://blog.csdn.net/faye0412/article/details/6883879/

//站点库代码参照:https://kyfw.12306.cn/otn/resources/js/framework/station_name.js

String trainDate = "2016-11-30";
String fromStation ="XAY";
String toStation = "SHH";
getHttp(trainDate,fromStation,toStation);
}

/**
 * @param trainDate  乘车日期
 * @param fromStation 起点站代码
 * @param toStation 终点站代码
 * @return void 无
 * @author liuyong
 * @serialData 2016年11月30日12:55:58
 */
public static void getHttp(String trainDate,String fromStation,String toStation) throws Exception {

JSONObject jsonObject = null;
JSONArray  jsonArray = null;
URL reqURL = new URL(
"https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date="+trainDate+"&leftTicketDTO.from_station="+fromStation+"&leftTicketDTO.to_station="+toStation+"&purpose_codes=ADULT"); // 
HttpsURLConnection httpsConn = (HttpsURLConnection) reqURL.openConnection();
InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream());

String jsonstring = "";

int respInt = insr.read();
while (respInt != -1) {

jsonstring += String.valueOf((char) respInt);
//System.out.print(((char) respInt));
respInt = insr.read();

}
jsonObject = JSONObject.fromObject(jsonstring);
//System.out.println(formatJson(jsonstring));

//System.out.println(jsonObject.get("data"));
jsonArray = JSONArray.fromObject(jsonObject.get("data"));

for(int i = 0 ; i < jsonArray.size(); i++){

JSONObject  tmpJsonBoj = jsonArray.getJSONObject(i);
JSONObject finalJsonObj = (JSONObject) tmpJsonBoj.get("queryLeftNewDTO");
String trainCode = finalJsonObj.getString("station_train_code");
String startStation  = finalJsonObj.getString("from_station_name");
String endStation = finalJsonObj.getString("to_station_name");
String satrtTime = finalJsonObj.getString("start_time");
String arrivalTime = finalJsonObj.getString("arrive_time");
String lishi= finalJsonObj.getString("lishi");
String canWebBuy = finalJsonObj.getString("canWebBuy");

//System.out.print("车次:" + trainCode);
System.out.printf("车次:");
System.out.printf("%-6s",trainCode);
System.out.printf("出发站:");
System.out.printf("%-10s",startStation);
System.out.printf("终点站:");
System.out.printf("%-10s",endStation);
System.out.printf("出发时间:");
System.out.printf("%-6s",satrtTime);
System.out.printf("到达时间:");
System.out.printf("%-6s",arrivalTime);
System.out.printf("历时:");
System.out.printf("%-6s",lishi);
System.out.printf("是否网购:");
System.out.printf("%-4s",canWebBuy);
System.out.println();
//剩下输出信息根据需要自己找吧
}

}

/**
 * 格式化json字符串,参照别人的代码,暂时没有用到
 * @param jsonStr
 * @return
 * @author  
 * @Date 
 */
    public static String formatJson(String jsonStr) {
        if (null == jsonStr || "".equals(jsonStr)) return "";
        StringBuilder sb = new StringBuilder();
        char last = '\0';
        char current = '\0';
        int indent = 0;
        for (int i = 0; i < jsonStr.length(); i++) {
            last = current;
            current = jsonStr.charAt(i);
            switch (current) {
                case '{':
                case '[':
                    sb.append(current);
                    sb.append('\n');
                    indent++;
                    addIndentBlank(sb, indent);
                    break;
                case '}':
                case ']':
                    sb.append('\n');
                    indent--;
                    addIndentBlank(sb, indent);
                    sb.append(current);
                    break;
                case ',':
                    sb.append(current);
                    if (last != '\\') {
                        sb.append('\n');
                        addIndentBlank(sb, indent);
                    }
                    break;
                default:
                    sb.append(current);
            }
        }

return sb.toString();
    }

/**
     * 添加space
     * @param 
     * @param 
     * @author   
     * @Date   
     */
    private static void addIndentBlank(StringBuilder sb, int indent) {
        for (int i = 0; i < indent; i++) {
            sb.append('\t');
        }
    }

}

java抓取数据包查询12306余票信息相关推荐

  1. Python爬虫学习(七)执行定时任务爬取12306余票信息发送邮件通知

    分析 我们输入的上海,北京都变成了对应的编号,比如,上海(SHH).北京(BJP),所以当我们程序进行输入的时候要进行一下处理,12306的一个地方存储着这些城市名与编码对应的文档: GET请求: h ...

  2. python怎么编写wireshark抓的包_使用Wireshark 抓取数据包

    Wireshark 是一个网络封包分析软件.网络封包分析软件的功能是获取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换. 一  ...

  3. libpcap抓取数据包

    libpcap是数据包捕获函数库.该库提供的C函数接口可用于需要捕获经过网络接口数据包的系统开发上.libpcap提供的接口函数主要实现和封装了与数据包截获有关的过程.这个库为不同的平台提供了一致的编 ...

  4. 夜神模拟器抓取数据包

    学习记录 & 以及为需要的人节约时间 1.拿到burp 的证书文件, 2.使用kali 自带的openssl 对证书进行处理 openssl x509 -inform DER -in cace ...

  5. wireshark设置端口镜像_H3C交换机端口镜像,抓取数据包wireshark实战

    端口镜像 system-vies     //进入配置模式 用户名:admin 密码:admin(默认) [H3C] dis cu int  查看所有端口的配置 [H3C] mirroring-gro ...

  6. Java获取12306余票信息(二)

    接上 前面我们说到如何用Firefox浏览器抓取数据,并 对json进行了分析,下面就是用Java代码来进行操作.以下代码都没有导入包,有需要自行导入 Java获取12306余票信息(一) Java获 ...

  7. Java获取12306余票信息(一)

    写在前面 写给自己,也分享给大家. Java获取12306余票信息(一) Java获取12306余票信息(二) Java获取12306余票信息(三) 步骤: 首先找找12306的API 1.打开谷歌浏 ...

  8. 使用Wireshark抓取数据包

    1.通过wireshark官网下载:https://www.wireshark.org/ 2.设置捕获过滤器 打开wireshark,菜单–>捕获–>捕获过滤器(F),如图1 在捕获过滤器 ...

  9. (二)、Python查询12306余票:联网查询余票信息并解析

    前一篇–>实现始发站.终点站和出发日期的合法性检验 以下如果有的变量不明白说明在前面的文章已经介绍了,切记! 首先我们来看看每查询一条信息12306网站返回的信息: 请求链接: https:// ...

最新文章

  1. Thymeleaf 入门
  2. Android之了解ThreadLocal
  3. Redis缓存穿透、击穿、雪崩及主从复制
  4. Java Web——图像上传
  5. matlab pca求曲率和法向量_实践课堂 已给出实例的MATLAB求解大汇总(线性规划)...
  6. 使用ABAP memory inspector分析product 搜索内存占用
  7. 936焊台(恒温电烙铁)温度不可调的维修 (Z)
  8. 最短路径——Dijkstra算法扩展(hdu2066,poj1062)
  9. python文件加锁
  10. python matlabplot写字_Matlab中plot基本用法的具体使用
  11. bbs与BLOG与SNS在区别
  12. QT实现电子表digitalclock
  13. Apple Pay的使用
  14. 单片机引脚浮空输入注意事项-STM32
  15. Asp.net 万年历
  16. [转][信息图表]Google十大高薪职位
  17. Frp配置——stcp及p2p模式
  18. 更新安卓系统部分代码
  19. 使用WinRT OCR API的WPF中的OCR
  20. 苹果审核Metadata Rejected解决

热门文章

  1. 屏幕小于6英寸的手机_2019有哪些小屏手机 8款6英寸以下小屏全面屏手机推荐
  2. 滴滴服务器不稳定,“滴滴崩了”登上热搜!是什么原因导致滴滴崩了呢?
  3. 2022年度回忆录我在 CSDN 的这一年
  4. 如何用 Visual Studio上传图片至网页
  5. MSTP+VRRP综合实验
  6. Internet Explorer 已不再尝试还原此网站。该网站看上去仍有问题。
  7. Elementary OS安装及开发环境配置(一)
  8. 云集群搭建-创建阿里云实例
  9. VS 2019 MFC 通过代码关闭 重启Windows 系统的方法和源代码
  10. C++中类,对象,封装,继承(派生),多态