一个通过httpclient抓取火车票信息的程序,需要修改下才能跑通,需要自己封装下httpclient,然后用get方式调用,还有fastJson,需要自己去解析下获得的数据,catchTrainInfo()是入口方法

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;import javax.annotation.Resource;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.Set;public class CatchTrainInfo {/*** 抓取火车票信息* @param attachmentId* @return*/@SuppressWarnings("unchecked")public  String catchTrainInfo() {//车站信息HashSet<String> station = new HashSet<String>();//临时车站信息HashSet<String> stationTmp = new HashSet<String>();//车次信息Map<String,String> train = new HashMap<String,String>();String stationHtml = HttpClientUtil.get("http://www.59178.com/zhan/");String stationName = "";//截取车站信息String stations[] = stationHtml.split("htm'>");for (int i = 0; i < stations.length; i++) {if (i == 0 ) {continue;}stationName = getStation(stations[i]);if("".equals(stationName)) {continue;}station.add(stationName);}//循环,根据车站信息获取车次信息getTrainsByStation(station,train);//循环,根据车次获取车次详情,并保存入库getTrainDetailsByTrains(stationTmp,train);//继续执行3次循环,(本来应该stationTmp.size()==0的时候,防止无限循环)int loop = 3;while (loop > 0) {//stationTmp 和 station比较,stationTmp去掉已经遍历过的站点,station用stationTmp替代,继续循环HashSet<String> stationTmp1 = (HashSet<String>) stationTmp.clone();for (String stationTmpElement : stationTmp) {for (String stationElement : station) {if(stationTmpElement.equals(stationElement)) {stationTmp.remove(stationTmpElement);}}}station = stationTmp1;//循环,根据车站信息获取车次信息getTrainsByStation(stationTmp,train);//循环,根据车次获取车次详情,并写入数据库getTrainDetailsByTrains(stationTmp,train);loop--;}return "success!";}/*** 根据车次获取车次详情,并写入数据库* @param stationTmp* @param train*/private  void getTrainDetailsByTrains(HashSet<String> stationTmp, Map<String, String> train) {Iterator<Entry<String, String>> iterator = train.entrySet().iterator();while (iterator.hasNext()) {Entry<String, String> entry = iterator.next();String key =  entry.getKey();String value =  entry.getValue();if("unused".equals(value)) {getAndSaveTrainsDetails(key,stationTmp);entry.setValue("used");}try {//休眠一会,防止反爬虫
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}}
}/*** 根据车站信息获取车次信息* @param station* @param train*/private  void getTrainsByStation(HashSet<String> station, Map<String, String> train) {Iterator<String> iterator = station.iterator();while (iterator.hasNext()) {String key = iterator.next();getTrainsInfo(train,key);try {//休眠一会,防止反爬虫
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}}}/**
* 根据车站信息得到车次信息
* @param train
* @param stationName
* @return
*/
private  void getTrainsInfo(Map<String, String> train, String stationName) {
try {
stationName = URLEncoder.encode(stationName,"utf-8");
} catch (UnsupportedEncodingException e1) {
log.error("转码出错了!stationName:" + stationName);
}
String url = "http://train.qunar.com/qunar/stationInfo.jsp?q=" + stationName + "&format=json";//根据车站信息获取车次  ticketInfoString ticketInfo = HttpClientUtil.get(url);try{@SuppressWarnings("unchecked")
java.util.Map<String, Object> ticketInfos = (Map<String, Object>) JSONObject.parseObject(ticketInfo, java.util.Map.class).get("ticketInfo");Set<Entry<String, Object>> entries = ticketInfos.entrySet( );if (entries != null) {Iterator<Entry<String, Object>> iterator = entries.iterator( );while (iterator.hasNext( )) {Entry<String, Object> entry = iterator.next();String key = (String) entry.getKey( );String trains[] = key.split("/");for(int i = 0; i< trains.length; i++) {train.put(trains[i], "unused");}}}} catch (Exception e) {log.info("根据车站信息得到车次信息报错:"+e.getMessage());}
}/**
* 解析得到车站信息
* @param str
* @return
*/
private  String getStation(String str) {
if (str == null || str.length() <= 0) {
return "";
}
int pos = -1;
pos = str.indexOf("</a>", pos + 1);
if (pos == -1) {
return "";
}
return str.substring(0, pos);
}/*** 根据车次获取车次详情,并保存入库* * @param key* @param stationTmp*/
public void getAndSaveTrainsDetails(String key, HashSet<String> stationTmp) {String url = "http://train.qunar.com/qunar/checiInfo.jsp?q=" + key + "&date=20170107&format=json";
String trainScheduleBody = HttpClientUtil.getUtf8(url);
try {
List<Object> ticketInfos = (List<Object>) JSONObject.parseObject(trainScheduleBody, Map.class)
.get("trainScheduleBody");for (int i = 0; i < ticketInfos.size(); i++) {
List<String> list = (List<String>) JSONObject.parseObject(ticketInfos.get(i).toString(), Map.class)
.get("content");
if (list == null || list.size() <= 0) {
continue;
}
stationTmp.add(list.get(1));// 得到详情,更新入库
//TODO
}} catch (Exception e) {
log.info("根据车次获取车次详情报错:" + e.getMessage());
}
}}

用httpclient抓取全国火车票信息相关推荐

  1. python+ BeautifulSoup抓取“全国行政区划信息查询平台”的省市区信息

    全国行政区划信息查询平台地址:http://xzqh.mca.gov.cn/map 检查网页源码: 检查网页源码可以发现: 所有省级信息全部在javaScript下的json中,会在页面加载时加载js ...

  2. python爬火车票是不是违法_python利用selenium+requests+beautifulsoup爬取12306火车票信息...

    在高速发展的时代.乘车出远门是必不可少的,有些查询信息是要收费的.这里打造免费获取火车票信息 想要爬取12306火车票信息,访问12306官方网站,输入出发地,目的地  ,时间  之后点击确定,这是我 ...

  3. Python多进程抓取全国邮政编码和长途区号

    由于Python设计的限制(就是咱们常用的CPython)最多只能用满1个CPU核心.Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其 ...

  4. java爬虫之WebMagic实战抓取前程无忧招聘信息

    webmagic教程 http://webmagic.io/docs/zh/ 入门案例 package com.hikktn.webmagic;import us.codecraft.webmagic ...

  5. apache httpclient 工具类_Java教程分享使用HttpClient抓取页面内容

    Java教程分享使用HttpClient抓取页面内容,使用HttpClient工具来发送Http请求 1.简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提 ...

  6. spring全局异常抓取validation校验信息

    spring全局异常抓取validation校验信息 参考文章: (1)spring全局异常抓取validation校验信息 (2)https://www.cnblogs.com/jianxiaopo ...

  7. 从人人网抓取高校数据信息,包括,省份 - 高校 - 院系 (提供最终SQL文件下载)...

    从人人网抓取高校数据信息,包括,省份 - 高校 - 院系 Author: handt Blog    : www.cnblogs.com/handt 涉及到的脚本和 SQL 文件 点此下载 ===== ...

  8. java response 获得code_Java教程分享使用HttpClient抓取页面内容

    Java教程分享使用HttpClient抓取页面内容,使用HttpClient工具来发送Http请求 1.简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提 ...

  9. python获取app信息的库_基于python3抓取pinpoint应用信息入库

    这篇文章主要介绍了基于python3抓取pinpoint应用信息入库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pinpoint是用Java编写 ...

最新文章

  1. keepalived_nginx实现discuz负载均衡和高可用
  2. 使用Dockerfile脚本创建镜像
  3. Telephone Number
  4. mac编辑器coda使用小贴条
  5. ubuntu cd 改变路径
  6. 【牛客 - 181F】子序列(容斥,组合数,费马小定理)
  7. 加速财务自由的7种理财方法
  8. wikioi 1306 机智Trie树
  9. 使用axis公布weblogic(一个)
  10. WPF编程基础入门 ——— 第三章 布局(四)布局面板StackPanel
  11. android开发:NDK开发配置
  12. python计算矩阵对角线之和_Python练习实例38 | 求3*3矩阵主对角线元素之和
  13. 偶尔会有的一点感受(二)
  14. ctfhub中Git泄露-log
  15. bitlocker加密怎么解除(破解Bitlocker加密方法)
  16. ecshop添加多国货币
  17. 计算机图形学——二维图形几何转换
  18. http://www.dewen.net.cn/q/15328/问个正则表达式 贪婪 和 不匹配某个字符串问题
  19. Oracle通过sql语句过滤ASCII控制字符
  20. RabbitMQ除开RPC的五种消模型----原生API

热门文章

  1. 基于IMDB评论数据集的情感分析
  2. 考试提交答案demo
  3. 线程安全问题的原因和解决方案
  4. 《宏景国际教育》会计工作:刚刚拿到德勤 Offer,和大家分享一下求职经历
  5. 5项有助于提高 Google 关键字排名的措施
  6. 微信小程序蓝牙使用总结
  7. Apache Doris介绍
  8. 原生js日历选择器插件开发实例教程
  9. GNSS数据/产品下载地址
  10. python基础课程学习笔记-第二节课