java实现12306查票_java爬取12306查询余票的操作
首先访问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查询余票的操作相关推荐
- java保存火车票信息_java抓取12306火车余票信息
最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,12306又没有提供专门的查票的接口.今天突然想起自己直接去12306上查询,抓取查询返回的数据包,这样 ...
- python 3爬取 12306余票
马上暑假集训结束,又要开学了,暑假集训老师让我们交暑假的学习成果~~虽然制作了几个小的网络爬虫的东西软件,什么淘宝,京东,天气,图片爬取的....但还是想要交个更好的,毕竟还是有成绩的...爬取123 ...
- Crawler:基于splinter.browser库实现爬取12306网站来实现快速抢票
Python之Crawler:爬取12306网站来实现快速抢票 目录 实现结果 实现代码 实现结果 实现代码 # -*- coding: utf-8 -*- from splinter.browser ...
- 2021最新 python爬取12306列车信息自动抢票并自动识别验证码(三)购票篇
项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否则后果自行 ...
- 2021最新python爬取12306列车信息自动抢票并自动识别验证码
项目描述 项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否 ...
- python爬取12306列车信息自动抢票并自动识别验证码(一)列车数据获取篇
项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master].注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一 ...
- python爬取12306列车信息自动抢票并自动识别验证码(二)selenium登录验证篇
项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时 ...
- Python爬虫学习(七)执行定时任务爬取12306余票信息发送邮件通知
分析 我们输入的上海,北京都变成了对应的编号,比如,上海(SHH).北京(BJP),所以当我们程序进行输入的时候要进行一下处理,12306的一个地方存储着这些城市名与编码对应的文档: GET请求: h ...
- python 爬取12306数据
学了好久的 java 换个语言试试 就选择了 简单易学的python ,学了一段时间看到别人都在爬取12306网站的数据,我也尝试尝试,发现 12306网站的数据更新太快.返回的json数据变得越来 ...
- 使用python爬取12306上面所有车次数据
在爬取12306之前需要做的工作就是: 1,分析请求过程 2,分析是否需要处理cookie 3,编写代码 4,测试爬取网站是否有访问次数限制 5,部署到正式服务器上 这里重点写 如何分析请求过程: 这 ...
最新文章
- Oracle10g安装中遇到的错误及解决办法
- 多语言切换jquery.i18n.min.js
- 【译】混沌工程与区块链
- csv python 图片 存_Python|任意网页中的所有网址的保存
- 如何在window上把你的项目提交到github
- 盘点阿里程序员常用的 15 款开发者工具
- log4net直切ElasticSearch,小步快跑首选
- 浪潮服务器硬盘阵列怎么做,server - 浪潮服务器RAID阵列配置及OS安装
- oracle 加号 用法,Oracle的加号(+)表示法和ansi JOIN符号之间的区别?
- 万事无忧之看看网站的PR值
- jupyter中怎么把图形在一个单独的窗口显示_QT绘图中的坐标概念
- 酒吧声场测试软件,做到以下几点 酒吧音响效果出奇的好
- Git fatal: write error: Broken pipe
- 压缩(minify)
- Visual Studio扩展开发(VS插件)
- java实现求调和数列的和,即:1/1 + 1/2 + ... + 1/n
- 我的Java学习笔记(二)飞机大战小游戏
- ios代码拨打电话时,电话号码格式兼容性处理问题:
- 多个excel工作簿、工作表合并
- 【matlab】三次埃尔米特插值与三次样条插值的实际应用代码