用httpclient抓取全国火车票信息
一个通过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抓取全国火车票信息相关推荐
- python+ BeautifulSoup抓取“全国行政区划信息查询平台”的省市区信息
全国行政区划信息查询平台地址:http://xzqh.mca.gov.cn/map 检查网页源码: 检查网页源码可以发现: 所有省级信息全部在javaScript下的json中,会在页面加载时加载js ...
- python爬火车票是不是违法_python利用selenium+requests+beautifulsoup爬取12306火车票信息...
在高速发展的时代.乘车出远门是必不可少的,有些查询信息是要收费的.这里打造免费获取火车票信息 想要爬取12306火车票信息,访问12306官方网站,输入出发地,目的地 ,时间 之后点击确定,这是我 ...
- Python多进程抓取全国邮政编码和长途区号
由于Python设计的限制(就是咱们常用的CPython)最多只能用满1个CPU核心.Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其 ...
- java爬虫之WebMagic实战抓取前程无忧招聘信息
webmagic教程 http://webmagic.io/docs/zh/ 入门案例 package com.hikktn.webmagic;import us.codecraft.webmagic ...
- apache httpclient 工具类_Java教程分享使用HttpClient抓取页面内容
Java教程分享使用HttpClient抓取页面内容,使用HttpClient工具来发送Http请求 1.简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提 ...
- spring全局异常抓取validation校验信息
spring全局异常抓取validation校验信息 参考文章: (1)spring全局异常抓取validation校验信息 (2)https://www.cnblogs.com/jianxiaopo ...
- 从人人网抓取高校数据信息,包括,省份 - 高校 - 院系 (提供最终SQL文件下载)...
从人人网抓取高校数据信息,包括,省份 - 高校 - 院系 Author: handt Blog : www.cnblogs.com/handt 涉及到的脚本和 SQL 文件 点此下载 ===== ...
- java response 获得code_Java教程分享使用HttpClient抓取页面内容
Java教程分享使用HttpClient抓取页面内容,使用HttpClient工具来发送Http请求 1.简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提 ...
- python获取app信息的库_基于python3抓取pinpoint应用信息入库
这篇文章主要介绍了基于python3抓取pinpoint应用信息入库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pinpoint是用Java编写 ...
最新文章
- keepalived_nginx实现discuz负载均衡和高可用
- 使用Dockerfile脚本创建镜像
- Telephone Number
- mac编辑器coda使用小贴条
- ubuntu cd 改变路径
- 【牛客 - 181F】子序列(容斥,组合数,费马小定理)
- 加速财务自由的7种理财方法
- wikioi 1306 机智Trie树
- 使用axis公布weblogic(一个)
- WPF编程基础入门 ——— 第三章 布局(四)布局面板StackPanel
- android开发:NDK开发配置
- python计算矩阵对角线之和_Python练习实例38 | 求3*3矩阵主对角线元素之和
- 偶尔会有的一点感受(二)
- ctfhub中Git泄露-log
- bitlocker加密怎么解除(破解Bitlocker加密方法)
- ecshop添加多国货币
- 计算机图形学——二维图形几何转换
- http://www.dewen.net.cn/q/15328/问个正则表达式 贪婪 和 不匹配某个字符串问题
- Oracle通过sql语句过滤ASCII控制字符
- RabbitMQ除开RPC的五种消模型----原生API