一、前言

  

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

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

  二、准备工作

  

  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来发起一个请求,里面的网址就填准备工作里面复制的那串

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

  

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

  1. package domain;
  2.  
  3. import java.security.cert.CertificateException;
  4. import java.security.cert.X509Certificate;
  5.  
  6. import javax.net.ssl.HostnameVerifier;
  7. import javax.net.ssl.HttpsURLConnection;
  8. import javax.net.ssl.SSLContext;
  9. import javax.net.ssl.SSLSession;
  10. import javax.net.ssl.TrustManager;
  11. import javax.net.ssl.X509TrustManager;
  12.  
  13. public class SslUtils {
  14.  
  15. public static void trustAllHttpsCertificates() throws Exception {
  16. TrustManager[] trustAllCerts = new TrustManager[1];
  17. TrustManager tm = new miTM();
  18. trustAllCerts[0] = tm;
  19. SSLContext sc = SSLContext.getInstance("SSL");
  20. sc.init(null, trustAllCerts, null);
  21. HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  22. }
  23.  
  24. static class miTM implements TrustManager,X509TrustManager {
  25. public X509Certificate[] getAcceptedIssuers() {
  26. return null;
  27. }
  28.  
  29. public boolean isServerTrusted(X509Certificate[] certs) {
  30. return true;
  31. }
  32.  
  33. public boolean isClientTrusted(X509Certificate[] certs) {
  34. return true;
  35. }
  36.  
  37. public void checkServerTrusted(X509Certificate[] certs, String authType)
  38. throws CertificateException {
  39. return;
  40. }
  41.  
  42. public void checkClientTrusted(X509Certificate[] certs, String authType)
  43. throws CertificateException {
  44. return;
  45. }
  46. }
  47.  
  48. public static void ignoreSsl() throws Exception{
  49. HostnameVerifier hv = new HostnameVerifier() {
  50. public boolean verify(String urlHostName, SSLSession session) {
  51. return true;
  52. }
  53. };
  54. trustAllHttpsCertificates();
  55. HttpsURLConnection.setDefaultHostnameVerifier(hv);
  56. }
  57. }

  然后跑一下这个方法,看到获取到了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. JS之This的用法

    This的用法 This作为JavaScript中的关键字,在函数中具有四种用法. 一.直接在函数中使用,谁调用这个函数,this就指向谁 例如: var n = "指我"; fu ...

  2. vue中使用Element主题自定义肤色

    一.搭建好项目的环境. 二.根据ElementUI官网的自定义主题(http://element.eleme.io/#/zh-CN/component/custom-theme)来安装[主题生成工具] ...

  3. [总结]WEB前端开发常用的CSS/CSS3知识点

    css3新单位vw.vh.vmin.vmax vh: 相对于视窗的高度, 视窗被均分为100单位的vh; vw: 相对于视窗的宽度, 视窗被均分为100单位的vw; vmax: 相对于视窗的宽度或高度 ...

  4. Dynamics CRM项目实例之六:积分管理,汇总字段,计算字段,快速查看视图

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复137或者20141228可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!        博文讲述的主要是如 ...

  5. SQLServer之修改表值函数

    修改表值函数注意事项 更改先前通过执行 CREATE FUNCTION 语句创建的现有 Transact-SQL 或 CLR 函数,但不更改权限,也不影响任何相关的函数.存储过程或触发器. 不能用 A ...

  6. C#生成JOSN字符串

    C#如何生成JSON字符串?(序列化对象)   第一章:C#如何拿到从http上返回JSON数据? 第二章:C#如何解析JSON数据?(反序列化对象) 第三章:C#如何生成JSON字符串?(序列化对象 ...

  7. InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised.解决办法

    最近使用requests进行get请求的时候,控制台输出如下错误. InsecureRequestWarning: Unverified HTTPS request is being made. Ad ...

  8. 周一01.4安装PyCharm步骤

    安装集成开发工具 步骤一 步骤二 步骤三 步骤四

  9. HybridStart发布v1.0测试版

    HybridStart是一款多webview模式的混合应用前端开发框架,本来只是作者自用的一套混合应用开发模板,为了进一步提高混合应用开发效率,近期着重在框架高通用性和易用性方面做了较大改进,比如将U ...

  10. Tmux 入门

    什么是 Tmux Tmux 官方 Wiki 简单来说,Tmux 是一个能够让你一个窗口当多个窗口使用的终端模拟器.并且你还可以将它放到后台,等到想使用的时候再使用. 为什么要用 Tmux 在服务器上调 ...