一、前言

  

  今年国庆和中秋一起放,虽然很欢快,但是没有票了!!!

  于是自己倒腾了一个查询余票的小程序。

  二、准备工作

  

  1、先打开12306的页面

  

  2、然后右键检查,点network

  

  3、再点一下12306页面上的查询,就可以看到发起了ajax请求

  

  4、点第一个,很明显是json串,这样就方便很多

  

  5、复制第二个的链接

  

  比如我这里就是:

      https://kyfw.12306.cn/otn/leftTicket/queryX?leftTicketDTO.train_date=2017-10-01&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=NJH&purpose_codes=ADULT

  三、开始工作

  这是通过HttpURLConnection来发起一个请求,里面的网址就填准备工作里面复制的那串

  /**
* 发起一个http请求
*/
public static void sendHttp(){
URL url;
int responsecode;
HttpURLConnection urlConnection;
BufferedReader reader;
String line;
try{
//忽略Ssl(针对12306)
SslUtils.ignoreSsl();
//生成一个URL对象
url=new URL("这里填你要访问的网址");
/**
* 这是为了防止12306对同一ip多次访问进行限制
* 这里填的ip是暂时有效的,想要获取更多就得自己去找 搜索代理ip
*/
System.getProperties().setProperty("proxySet", "true");
System.setProperty("http.proxyHost", "120.78.15.63");
System.setProperty("http.proxyPort", "80");
//打开URL
urlConnection = (HttpURLConnection)url.openConnection();
//伪造一个请求头 一般网页不用,有些网站会看你有没有请求头,比如 12306......
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0");
urlConnection.setRequestProperty("Host","kyfw.12306.cn");
urlConnection.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
urlConnection.setRequestProperty("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
urlConnection.setRequestProperty("Accept-Encoding","identity");
urlConnection.setRequestProperty("Connection","keep-alive");
urlConnection.setRequestProperty("Upgrade-Insecure-Requests","1");
//获取服务器响应代码
responsecode=urlConnection.getResponseCode();
//假如响应代码为200,就是代表成功
if(responsecode==200){
reader=new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));
while((line=reader.readLine())!=null){
System.out.println(line);//在这里干你想干的事情
}
}else{
System.out.println("获取不到网页的源码,服务器响应代码为:"+responsecode);
}
}catch(Exception e){
System.out.println("获取不到网页的源码,出现异常:"+e);
}
}

  

  跑这个方法之前还需要用到一个类,是用来忽略12306的证书问题

package domain;

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; public class SslUtils { public static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} static class miTM implements TrustManager,X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
} public boolean isServerTrusted(X509Certificate[] certs) {
return true;
} public boolean isClientTrusted(X509Certificate[] certs) {
return true;
} public void checkServerTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
} public void checkClientTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
} public static void ignoreSsl() throws Exception{
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
}

  然后跑一下这个方法,看到获取到了json

  

  就可以对这串字符串为所欲为了,嘿嘿嘿

  四、最后

  

  一般查到余票都是发邮件,不会JavaMail的可以看我另一篇博客,开箱即用。

  转载需标注原文地址!

Java爬取12306余票的更多相关文章

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

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

  2. MinerHtmlThread.java 爬取页面线程

    MinerHtmlThread.java 爬取页面线程 package com.iteye.injavawetrust.miner; import org.apache.commons.logging ...

  3. MinerConfig.java 爬取配置类

    MinerConfig.java 爬取配置类 package com.iteye.injavawetrust.miner; import java.util.List; /** * 爬取配置类 * @ ...

  4. Java爬取网络博客文章

    前言 近期本人在某云上购买了个人域名,本想着以后购买与服务器搭建自己的个人网站,由于需要筹备的太多,暂时先搁置了,想着先借用GitHub Pages搭建一个静态的站,搭建的过程其实也曲折,主要是域名地 ...

  5. Java爬取校内论坛新帖

    Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...

  6. Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云

    一 . Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号, ...

  7. java爬取网页内容 简单例子(2)——附jsoup的select用法详解

    [背景] 在上一篇博文java爬取网页内容 简单例子(1)——使用正则表达式 里面,介绍了如何使用正则表达式去解析网页的内容,虽然该正则表达式比较通用,但繁琐,代码量多,现实中想要想出一条简单的正则表 ...

  8. java爬取并下载酷狗TOP500歌曲

    是这样的,之前买车送的垃圾记录仪不能用了,这两天狠心买了好点的记录仪,带导航.音乐.蓝牙.4G等功能,寻思,既然有这些功能就利用起来,用4G听歌有点奢侈,就准备去酷狗下点歌听,居然都是需要办会员才能下 ...

  9. Java爬取并下载酷狗音乐

    本文方法及代码仅供学习,仅供学习. 案例: 下载酷狗TOP500歌曲,代码用到的代码库包含:Jsoup.HttpClient.fastJson等. 正文: 1.分析是否可以获取到TOP500歌单 打开 ...

随机推荐

  1. SAP MM 事务代码MI31之思考

    SAP MM 事务代码MI31之思考 1 - MI01之痛 多年SAP项目实施实践中,笔者之前对于SAP系统里盘点凭证创建(MI01)事务代码里的输入界面很是不爽: 第一,MI01输入了一行数据以后, ...

  2. Sql server 2014 数据库还原奇异现象

    用A库来还原B库   对正在使用的B库执行还原,还原时修改数据库名称,还原出错,提示数据库正在使用.删除B库,仍然提示正在使用,感觉像僵尸     重启SQL SERVER,因B库已删除,在A库上点击 ...

  3. Android--解决图片保存到相册显示1970年1月1日 8:00的问题

    import android.content.Context; import android.content.Intent; import android.database.Cursor; impor ...

  4. 基于Git项目管理客户端SourceTree的免注册安装及远程连接方法

    作为程序员,不可避免的要在github上查询代码,而在企业项目中,为了使得项目好管理需要使用项目管理客户端,所以接下来详细讲解一下基于git的sourceTree在windows系统下的安装及与Git ...

  5. 智能POS如何获取日志&数据库文件

    使用Teamviewer连接安卓机器,文件传输 ================================================================== 智能POS查看数据 ...

  6. Windows Java包环境变量的设置

    复制Bin文件所在路径 验证

  7. web.xml设置过滤直接访问

    <security-constraint> <web-resource-collection> <web-resource-name>JSPs</web-re ...

  8. ASP.NET Zero--后端应用程序

    后端应用程序 这是用户名和密码输入的实际应用程序.您将主要在此应用程序上添加您的业务需求. 应用文件夹 后端应用程序默认内置在专用区域,名为“ App ”,但可以在创建解决方案时确定.因此,所有控制器 ...

  9. 20181218 - PostgreSQL Auto Commit Guide(自动提交)

    20181218 - PostgreSQL Auto Commit Guide 参考官网简介,https://www.postgresql.org/docs/10/ecpg-sql-set-autoc ...

  10. python正则表达式模块re

    正则表达式的特殊元素 匹配符号 描述 '.'(点dot) 在默认模式下,它匹配除换行符之外的任何字符.如果指定了DOTALL标志,则匹配包括换行符在内的任何字符 '^'(Caret) 匹配以字符串开头 ...