本文章为原创文章,转载请注明,欢迎评论和改正。

一,分析

之前所用的直接通过HTML中的元素值来爬取一些网页上的数据,但是一些比较敏感的数据,很多正规网站都是通过json数据存储,这些数据通过HTML元素是爬取不到的,所以只能通过json数据的api接口来爬取数据。

二,网站处理

1,打开去哪儿网的网站https://train.qunar.com/,找到火车票查询,输入起点终点和日期,查询。

2,右击打开审查元素,点击network

3,刷新网页,找到XHR,点击链接

4,找到s2sBeanList这一属性,打开即为所需要的数据

header里有所需的地址

三,项目结构

1,所需jar包,基本是分析json数据的时候用到

2,项目目录结构

四,代码分析

1,解析URL地址,并以将json数据转化为String类型返回

public static String geturl(String url){

StringBuffer json = new StringBuffer();

try {

URL u = new URL(url);

URLConnection yc = u.openConnection();

//读取返回的数据

BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(),"UTF-8"));

String inputline = null;

while((inputline=in.readLine())!=null){

json.append(inputline);

}

in.close();

} catch (Exception e) {

e.printStackTrace();

}

//将StringBuffer转化为json格式的字符串

String jsonStr=json.toString();

//将不规范的字符串形式的json数据规范化

jsonStr=jsonStr.substring(jsonStr.indexOf("{"),jsonStr.length()-1);

return jsonStr;

}

2,将地址转化为经纬度的方法(用到即可取)

public static String getLngLat(String address) {

StringBuffer json = new StringBuffer();

try {

URL u = new URL("http://restapi.amap.com/v3/geocode/geo?address="+address+"&output=JSON&key=7f4ffae4074e8b8e4d147190527a4b72");

URLConnection yc = u.openConnection();

//读取返回的数据

BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(),"UTF-8"));

String inputline = null;

while((inputline=in.readLine())!=null){

json.append(inputline);

}

in.close();

} catch (Exception e) {

e.printStackTrace();

}

String jsonStr=json.toString();

JSONObject jsonObject = JSONObject.fromObject(jsonStr);

//判断是否有这个点

if(jsonObject.getJSONArray("geocodes").size()>0)

return jsonObject.getJSONArray("geocodes").getJSONObject(0).get("location").toString();

else

return null;

}

3,查询火车票的代码

public static List loadTrainRoute(String startPoint,String endPoint,String date) {

String strUrl="https://train.qunar.com/dict/open/s2s.do?callback=jQuery17203917861486539813_1558231852669"

+ "&dptStation="+startPoint+"&arrStation="+endPoint+"&date="+date //日期格式2019-05-20

+ "&type=normal&user=neibu&source=site&start=1&num=500&sort=3&_=1558231852892";

//调用方法将url转为json格式的字符串

String jsonStr=geturl(strUrl);

JSONObject jsonObject = JSONObject.fromObject(jsonStr);

JSONArray jArray=jsonObject.getJSONObject("data").getJSONArray("s2sBeanList");

for(int i=0;i

//循环遍历所有车次

jsonObject=(jArray.getJSONObject(i));

System.out.println("起点:"+startPoint);

System.out.println("起点经纬度:"+getLngLat(startPoint)); //getLngLat 调用将地址转化为经纬度的方法

System.out.println("车次"+jsonObject.get("trainNo").toString());

System.out.println("车站:"+jsonObject.get("dptStationName")+"-"+jsonObject.get("arrStationName"));

System.out.println("时间段:"+jsonObject.get("dptTime")+"-"+jsonObject.get("arrTime"));

System.out.println("一等座的价格:"+jsonObject.getJSONObject("seats").getJSONObject("一等座").get("price"));

System.out.println("一等座的剩余票数:"+jsonObject.getJSONObject("seats").getJSONObject("一等座").get("count"));

}

return null;

}

jsonObject=(jArray.getJSONObject(i));为循环遍历所有车次

五,完整代码

package test;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.URL;

import java.net.URLConnection;

import java.util.List;

import com.travel.bean.TrainMess;

import com.travel.util.AddressLngLatExchange;

import net.sf.json.JSONArray;

import net.sf.json.JSONObject;

public class GetTrainTest {

//解析URL

public static String geturl(String url){

StringBuffer json = new StringBuffer();

try {

URL u = new URL(url);

URLConnection yc = u.openConnection();

//读取返回的数据

BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(),"UTF-8"));

String inputline = null;

while((inputline=in.readLine())!=null){

json.append(inputline);

}

in.close();

} catch (Exception e) {

e.printStackTrace();

}

//将StringBuffer转化为json格式的字符串

String jsonStr=json.toString();

jsonStr=jsonStr.substring(jsonStr.indexOf("{"),jsonStr.length()-1);

return jsonStr;

}

//调用将地址转化为经纬度的方法

public static String getLngLat(String address) {

StringBuffer json = new StringBuffer();

try {

URL u = new URL("http://restapi.amap.com/v3/geocode/geo?address="+address+"&output=JSON&key=7f4ffae4074e8b8e4d147190527a4b72");

URLConnection yc = u.openConnection();

//读取返回的数据

BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(),"UTF-8"));

String inputline = null;

while((inputline=in.readLine())!=null){

json.append(inputline);

}

//System.out.println(json);

in.close();

} catch (Exception e) {

e.printStackTrace();

}

String jsonStr=json.toString();

JSONObject jsonObject = JSONObject.fromObject(jsonStr);

//System.out.println(jsonObject.getJSONArray("geocodes"));

if(jsonObject.getJSONArray("geocodes").size()>0)

return jsonObject.getJSONArray("geocodes").getJSONObject(0).get("location").toString();

else

return null;

}

@SuppressWarnings("null")

public static List loadTrainRoute(String startPoint,String endPoint,String date) {

String strUrl="https://train.qunar.com/dict/open/s2s.do?callback=jQuery17203917861486539813_1558231852669"

+ "&dptStation="+startPoint+"&arrStation="+endPoint+"&date="+date //日期格式2019-05-20

+ "&type=normal&user=neibu&source=site&start=1&num=500&sort=3&_=1558231852892";

//调用方法将url转为json格式的字符串

String jsonStr=geturl(strUrl);

JSONObject jsonObject = JSONObject.fromObject(jsonStr);

JSONArray jArray=jsonObject.getJSONObject("data").getJSONArray("s2sBeanList");

for(int i=0;i

jsonObject=(jArray.getJSONObject(i));

System.out.println("起点:"+startPoint);

System.out.println("起点经纬度:"+getLngLat(startPoint)); //getLngLat 调用将地址转化为经纬度的方法

System.out.println("车次"+jsonObject.get("trainNo").toString());

System.out.println("车站:"+jsonObject.get("dptStationName")+"-"+jsonObject.get("arrStationName"));

System.out.println("时间段:"+jsonObject.get("dptTime")+"-"+jsonObject.get("arrTime"));

System.out.println("一等座的价格:"+jsonObject.getJSONObject("seats").getJSONObject("一等座").get("price"));

System.out.println("一等座的剩余票数:"+jsonObject.getJSONObject("seats").getJSONObject("一等座").get("count"));

}

return null;

}

public static void main(String[] args) {

loadTrainRoute("北京", "上海", "2019-06-10");

}

}

六,火车车次的站点信息查询

1,分析:因为火车车次和改车次的站点数据存储的位置不同,所以车站站点信息要更改URL

2,刷新网页点击一个车次,展开查看经停

3,先点击XHR,然后点击js,查看到改车次的信息

根据URL道理同上,对json数据进行分析,然后爬取下来。

本文章为原创文章,转载请注明,欢迎评论和改正。

java车次信息_java实现根据起点终点和日期查询去哪儿网的火车车次和火车站点信息...相关推荐

  1. java添加信息_java – 向异常添加信息

    我想向堆栈跟踪/异常添加信息. 基本上我现在有这样的东西,我真的很喜欢: Exception in thread "main" java.lang.ArithmeticExcept ...

  2. linux查看java堆栈信息_Java运行状态分析2:获取线程堆栈信息

    Java运行状态分析2:获取线程堆栈信息 基本概念 出现内存泄漏或者运行缓慢场景,有时候无法直接从业务日志看出问题时候,需要分析jvm内存和线程堆栈 线程堆栈信息主要记录jvm线程在某时刻线程执行情况 ...

  3. java mp3 信息_java读取MP3的信息

    标签头"TAG" 3字节 标题 30字节 作者 30字节 专辑 30字节 出品年份 4字节 备注信息 28字节 保留 1字节 音轨 1字节 类型 1字节 import java.i ...

  4. java mp3 信息_java读取MP3的信息 | 学步园

    标签头"TAG" 3字节 标题 30字节 作者 30字节 专辑 30字节 出品年份 4字节 备注信息 28字节 保留 1字节 音轨 1字节 类型 1字节 import java.i ...

  5. java wifi信息_Java中如何获取WiFi的名称和信息?

    =Start= 缘由: 收集整理一下在Java中如何获取WiFi相关信息的方法,方便需要的时候使用. 正文: 参考解答: 简单来说就是:Java中没有原生的类来实现这个功能(不像获取IP或主机名时还有 ...

  6. mysql查询所有的Java工程师信息_JAVA开发工程师 | 广州三地信息技术有限公司

    本期导读 2019届丨广州市内最后一场省教育厅主办的系列供需见面活动 聘丨中国人寿保险股份有限公司肇庆分公司 安卓移动开发工程师 | 广州南方卫星导航仪器有限公司 软件工程师 | 广州西敏旅运票务有限 ...

  7. java mp3 信息_Java代码获取Mp3音乐的歌名、歌手、专辑名等信息

    这里介绍的是使用Jaudiotagger库获取Mp3音频文件的歌名.歌手.专辑名等信息.使用的jaudiotagger-2.2.6-SNAPSHOT.jar包下载地址:Download. 实现代码如下 ...

  8. java mp3 信息_java 读取 mp3 信息

    我是个新手,因为要做一个mp3的播放软件,网上搜到了一个读取信息的代码,在这里想分享下.原作者是 NullPointException 首先需要下载 jaudiotagger-2.2.2.jar 包, ...

  9. java 员工信息_JAVA控制台输入输出员工信息

    //Employe类 基本信息 package 练习; import java.util.Date; public class Employee { private String name; priv ...

最新文章

  1. Springboot在IDEA热部署的配置方法
  2. java邮箱_java发送邮件(qq邮箱)
  3. Angular Light 指令用法
  4. python动态与静态语言_静态语言和动态语言的区别
  5. ActionScript3.0面向对象编程的三个特征的论述?
  6. Python scapy网络包嗅探模块(转载)
  7. android车机升级carplay,现代增加支持DIY升级CarPlay,Android Auto的车型
  8. apache+php+mysql 常见集成环境安装包
  9. zip压缩文件内中文名字符编码解压乱码问题
  10. 人民大学赵鑫:基于知识与推理的序列化推荐技术研究
  11. Java项目:基于jsp+ssm乐轩公司订餐系统(计算机毕业设计)
  12. snaker流程预览
  13. crx文件怎么打开(谷歌crx文件怎么打开)
  14. 天正对应cad版本_天正CAD图形找不到可用的AutoCAD版本怎么办?
  15. Flex ikev2
  16. linux条件变量cond,Linux C 条件变量cond的使用记录
  17. uni-app 生命周期
  18. DVWA windows提权
  19. Resources的使用方式
  20. Shotgun/Shotgrid入门学习笔记一

热门文章

  1. Substrate之旅4:基于Substrate私有链的搭建
  2. Matlab图像的噪声处理
  3. MTK FAQ解决方案官方资料介绍(MT6765/MT6762/MT6761芯片平台)
  4. 解决VMware中Ubuntu占用空间过大的问题(Ubuntu虚拟机空间回收)
  5. 固定资产管理系统比Excel资产管理好在哪儿呢?
  6. 贝塞尔曲线的数学原理
  7. html mata头部标签详解
  8. Google三驾马车之GFS
  9. ifix从sqlserver里读数据_Ifix学习(7)
  10. 西门子S7-200 SMART(6ES7 288-1ST40-0AA0)相关与晨控智能CK-FR08-E00关于modbus tcp 通信配置指南