Java爬取12306余票
今年国庆和中秋一起放,虽然很欢快,但是没有票了!!!
于是自己倒腾了一个查询余票的小程序。
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余票的更多相关文章
- java抓取12306火车余票信息
最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,12306又没有提供专门的查票的接口.今天突然想起自己直接去12306上查询,抓取查询返回的数据包,这样 ...
- MinerHtmlThread.java 爬取页面线程
MinerHtmlThread.java 爬取页面线程 package com.iteye.injavawetrust.miner; import org.apache.commons.logging ...
- MinerConfig.java 爬取配置类
MinerConfig.java 爬取配置类 package com.iteye.injavawetrust.miner; import java.util.List; /** * 爬取配置类 * @ ...
- Java爬取网络博客文章
前言 近期本人在某云上购买了个人域名,本想着以后购买与服务器搭建自己的个人网站,由于需要筹备的太多,暂时先搁置了,想着先借用GitHub Pages搭建一个静态的站,搭建的过程其实也曲折,主要是域名地 ...
- Java爬取校内论坛新帖
Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...
- Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云
一 . Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号, ...
- java爬取网页内容 简单例子(2)——附jsoup的select用法详解
[背景] 在上一篇博文java爬取网页内容 简单例子(1)——使用正则表达式 里面,介绍了如何使用正则表达式去解析网页的内容,虽然该正则表达式比较通用,但繁琐,代码量多,现实中想要想出一条简单的正则表 ...
- java爬取并下载酷狗TOP500歌曲
是这样的,之前买车送的垃圾记录仪不能用了,这两天狠心买了好点的记录仪,带导航.音乐.蓝牙.4G等功能,寻思,既然有这些功能就利用起来,用4G听歌有点奢侈,就准备去酷狗下点歌听,居然都是需要办会员才能下 ...
- Java爬取并下载酷狗音乐
本文方法及代码仅供学习,仅供学习. 案例: 下载酷狗TOP500歌曲,代码用到的代码库包含:Jsoup.HttpClient.fastJson等. 正文: 1.分析是否可以获取到TOP500歌单 打开 ...
随机推荐
- JS之This的用法
This的用法 This作为JavaScript中的关键字,在函数中具有四种用法. 一.直接在函数中使用,谁调用这个函数,this就指向谁 例如: var n = "指我"; fu ...
- vue中使用Element主题自定义肤色
一.搭建好项目的环境. 二.根据ElementUI官网的自定义主题(http://element.eleme.io/#/zh-CN/component/custom-theme)来安装[主题生成工具] ...
- [总结]WEB前端开发常用的CSS/CSS3知识点
css3新单位vw.vh.vmin.vmax vh: 相对于视窗的高度, 视窗被均分为100单位的vh; vw: 相对于视窗的宽度, 视窗被均分为100单位的vw; vmax: 相对于视窗的宽度或高度 ...
- Dynamics CRM项目实例之六:积分管理,汇总字段,计算字段,快速查看视图
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复137或者20141228可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 博文讲述的主要是如 ...
- SQLServer之修改表值函数
修改表值函数注意事项 更改先前通过执行 CREATE FUNCTION 语句创建的现有 Transact-SQL 或 CLR 函数,但不更改权限,也不影响任何相关的函数.存储过程或触发器. 不能用 A ...
- C#生成JOSN字符串
C#如何生成JSON字符串?(序列化对象) 第一章:C#如何拿到从http上返回JSON数据? 第二章:C#如何解析JSON数据?(反序列化对象) 第三章:C#如何生成JSON字符串?(序列化对象 ...
- InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised.解决办法
最近使用requests进行get请求的时候,控制台输出如下错误. InsecureRequestWarning: Unverified HTTPS request is being made. Ad ...
- 周一01.4安装PyCharm步骤
安装集成开发工具 步骤一 步骤二 步骤三 步骤四
- HybridStart发布v1.0测试版
HybridStart是一款多webview模式的混合应用前端开发框架,本来只是作者自用的一套混合应用开发模板,为了进一步提高混合应用开发效率,近期着重在框架高通用性和易用性方面做了较大改进,比如将U ...
- Tmux 入门
什么是 Tmux Tmux 官方 Wiki 简单来说,Tmux 是一个能够让你一个窗口当多个窗口使用的终端模拟器.并且你还可以将它放到后台,等到想使用的时候再使用. 为什么要用 Tmux 在服务器上调 ...