首先访问12306的进行余票查询,比如我查询 武汉到深圳 时间是 2018-05-22的余票

通过浏览器F12可以看到查询信息的接口是如下:

可以看到接口中传入四个参数,leftTicketDTO.train_date,leftTicketDTO.from_station,leftTicketDTO.to_station,

purpose_codes.代表的意思是出发时间,起始地,目的地,票的类型(默认为成年人)

参数里面的地点用的是字典码,需要我们找到字典,

还是通过浏览器F12查看,来自于一个js(我也是看别人的文章知道的)

可以直接打开看到里面是一串很长的字符串,

1526887430(1).png

接下来就是对这个字符串的处理:

我这里用java的httpclient处理的:

CloseableHttpClient httpClient = HttpClients.createDefault();

URI uri = new URIBuilder()

.setScheme("https")

.setHost("kyfw.12306.cn")

.setPath("otn/resources/js/framework/station_name.js")

.setParameter("station_version", "1.9053")

.build();

System.out.println(uri);

HttpGet httpGet = new HttpGet(uri);

httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36");

HashMap map = new HashMap<>();

HashMap rev_map = new HashMap<>();

try {

CloseableHttpResponse response = httpClient.execute(httpGet);

HttpEntity entity = response.getEntity();

String mess = EntityUtils.toString(entity);

System.out.println(mess);//内容是全的

String reg = "([\\u4e00-\\u9fa5]+)\\|([A-Z]+)";//正则表达式匹配

Pattern compile = Pattern.compile(reg);

//利用正则把所有匹配到的都存入map集合

while (true) {

Matcher matcher = compile.matcher(mess);

if (matcher.find()) {

//System.out.println(matcher.group());

mess = mess.substring(mess.indexOf(matcher.group())+matcher.group().length());

String[] strings = matcher.group().split("\\|"); //双斜线转义

map.put(strings[1],strings[0]); //地点,地点码

rev_map.put(strings[0],strings[1]); //地点码,地点

}else {

break;

}

}

这里将得到的字典序列化到本地,避免每次使用字典都去查一次.

FileOutputStream out = new FileOutputStream("D:\\station.txt");

ObjectOutputStream oos = new ObjectOutputStream(out);

oos.writeObject(map);

oos.close();

接下来直接直接调用接口就行了,还是用的httpclient

public static List getINfo(String from_station,String to_station,String date) throws URISyntaxException {

CloseableHttpClient httpClient = HttpClients.createDefault();

String from_code = station_name.getCodeByCity(from_station);

String ro_code = station_name.getCodeByCity(to_station);

//uri的构造器

URI uri = new URIBuilder()

.setScheme("https")

.setHost("kyfw.12306.cn")

.setPath("/otn/leftTicket/query")

.setParameter("leftTicketDTO.train_date", date) //2018-05-04

.setParameter("leftTicketDTO.from_station", from_code)

.setParameter("leftTicketDTO.to_station", ro_code)

.setParameter("purpose_codes", "ADULT")

.build();

// HttpGet httpGet = new HttpGet("https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2018-05-03&leftTicketDTO.from_station=HKN&leftTicketDTO.to_station=HAN&purpose_codes=ADULT");

System.out.println(uri);

HttpGet httpGet = new HttpGet(uri);

httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36");

//System.out.println(httpGet.getURI());

List> list = new ArrayList<>();

try {

CloseableHttpResponse response = httpClient.execute(httpGet);

HttpEntity entity = response.getEntity();

//System.out.println(entity);

String message = EntityUtils.toString(entity);

System.out.println(message);

ObjectMapper mapper = new ObjectMapper();

JsonNode node = mapper.readTree(message);

JsonNode result = node.get("data").get("result");

System.out.println(result.get(1));

//直接遍历result

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

HashMap map = new LinkedHashMap<>();

String str = String.valueOf(result.get(i));

//System.out.println(str);

String[] strings = str.split("\\|"); //加两个反斜线转义

String train_no = strings[3];

String from_station_code = strings[6];

String from_station_name = station_name.getCityByCode(from_station_code);

String to_station_code = strings[7];

String to_station_name = station_name.getCityByCode(to_station_code);

String start_time = strings[8];

String arrive_time = strings[9];

String first_class_seat = strings[31] ; //一等座

String second_class_seat = strings[30]; //二等座

String soft_sleep = strings[23]; //软卧

String hard_sleep = strings[28]; //硬卧

String hard_seat = strings[29]; //硬座

String no_seat = strings[26]; //无座

map.put("train_no",train_no);

map.put("from_station_name",from_station_name);

map.put("to_station_name",to_station_name);

map.put("start_time",start_time);

map.put("arrive_time",arrive_time);

map.put("first_class_seat",first_class_seat);

map.put("second_class_seat",second_class_seat);

map.put("soft_sleep",soft_sleep);

map.put("hard_sleep",hard_sleep);

map.put("hard_seat",hard_seat);

map.put("no_seat",no_seat);

//System.out.println(map);

list.add(map);

}

System.out.println(list);

System.out.println("-------------------------------------------------");

// System.out.println(getStation("WCN"));

response.close();

httpClient.close();

} catch (IOException e) {

e.printStackTrace();

}

return list;

}

最后处理了下,做了个简单的查询页面:

1526887668(1).png

java实现12306查票_java爬取12306查询余票的操作相关推荐

  1. java保存火车票信息_java抓取12306火车余票信息

    最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,12306又没有提供专门的查票的接口.今天突然想起自己直接去12306上查询,抓取查询返回的数据包,这样 ...

  2. python 3爬取 12306余票

    马上暑假集训结束,又要开学了,暑假集训老师让我们交暑假的学习成果~~虽然制作了几个小的网络爬虫的东西软件,什么淘宝,京东,天气,图片爬取的....但还是想要交个更好的,毕竟还是有成绩的...爬取123 ...

  3. Crawler:基于splinter.browser库实现爬取12306网站来实现快速抢票

    Python之Crawler:爬取12306网站来实现快速抢票 目录 实现结果 实现代码 实现结果 实现代码 # -*- coding: utf-8 -*- from splinter.browser ...

  4. 2021最新 python爬取12306列车信息自动抢票并自动识别验证码(三)购票篇

    项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否则后果自行 ...

  5. 2021最新python爬取12306列车信息自动抢票并自动识别验证码

    项目描述 项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否 ...

  6. python爬取12306列车信息自动抢票并自动识别验证码(一)列车数据获取篇

    项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master].注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一 ...

  7. python爬取12306列车信息自动抢票并自动识别验证码(二)selenium登录验证篇

    项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时 ...

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

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

  9. python 爬取12306数据

    学了好久的 java  换个语言试试 就选择了 简单易学的python ,学了一段时间看到别人都在爬取12306网站的数据,我也尝试尝试,发现 12306网站的数据更新太快.返回的json数据变得越来 ...

  10. 使用python爬取12306上面所有车次数据

    在爬取12306之前需要做的工作就是: 1,分析请求过程 2,分析是否需要处理cookie 3,编写代码 4,测试爬取网站是否有访问次数限制 5,部署到正式服务器上 这里重点写 如何分析请求过程: 这 ...

最新文章

  1. Oracle10g安装中遇到的错误及解决办法
  2. 多语言切换jquery.i18n.min.js
  3. 【译】混沌工程与区块链
  4. csv python 图片 存_Python|任意网页中的所有网址的保存
  5. 如何在window上把你的项目提交到github
  6. 盘点阿里程序员常用的 15 款开发者工具
  7. log4net直切ElasticSearch,小步快跑首选
  8. 浪潮服务器硬盘阵列怎么做,server - 浪潮服务器RAID阵列配置及OS安装
  9. oracle 加号 用法,Oracle的加号(+)表示法和ansi JOIN符号之间的区别?
  10. 万事无忧之看看网站的PR值
  11. jupyter中怎么把图形在一个单独的窗口显示_QT绘图中的坐标概念
  12. 酒吧声场测试软件,做到以下几点 酒吧音响效果出奇的好
  13. Git fatal: write error: Broken pipe
  14. 压缩(minify)
  15. Visual Studio扩展开发(VS插件)
  16. java实现求调和数列的和,即:1/1 + 1/2 + ... + 1/n
  17. 我的Java学习笔记(二)飞机大战小游戏
  18. ios代码拨打电话时,电话号码格式兼容性处理问题:
  19. 多个excel工作簿、工作表合并
  20. 【matlab】三次埃尔米特插值与三次样条插值的实际应用代码

热门文章

  1. 马未都说收藏:陶瓷篇-常见瓷器器形分类
  2. python七段数码管的绘制 获取系统时间
  3. tp框架获取服务器信息,tp5获取服务器地址
  4. 部署听云服务器监测探针
  5. android生成透明图片格式,Android编程实现图片透明的方法
  6. 淘宝测试开发实习总结
  7. 使用SpringMVC框架实现员工管理系统
  8. python 定义函数为什么有个长线_为什么说长线相对于短线容易成功?
  9. 第一次做Google SEO,如何才能做好谷歌的优化?
  10. C语言因式分解的程序框图,C语言编写方案-因式分解