在上篇文章Java数据爬取——爬取携程酒店数据(一)爬取所有地区后,继续根据地区数据爬取酒店数据

1.首先思考怎样根据地域获取地域酒店信息,那么我们看一下携程上是怎样获得的。

还是打开http://hotels.ctrip.com/domestic-city-hotel.html 这个地址,随便点击一个地区进去(这里我选取澳门作为示例),点击第二页数据,很高兴发现

2.模拟请求,获取数据

从这里可以发现,是POST请求,请求的body中有很多参数,

所以先封装一下参数,经过测试,有些参数可以不用传递,这里写了一个方法,模拟请求

public String getHotelListString(HotelCity city, String page){

HashMap params = new HashMap();

params.put("__VIEWSTATEGENERATOR", "DB1FBB6D");

params.put("cityName", city.getCityName());

// params.put("StartTime", "2016-11-24");

// params.put("DepTime", "2016-11-25");

params.put("txtkeyword", "");

params.put("Resource", "");

params.put("Room", "");

params.put("Paymentterm", "");

params.put("BRev", "");

params.put("Minstate", "");

params.put("PromoteType", "");

params.put("PromoteDate", "");

params.put("operationtype", "NEWHOTELORDER");

params.put("PromoteStartDate", "");

params.put("PromoteEndDate", "");

params.put("OrderID", "");

params.put("RoomNum", "");

params.put("IsOnlyAirHotel", "F");

params.put("cityId", city.getCityId());

params.put("cityPY", city.getPinyin());

// params.put("cityCode", "1853");

// params.put("cityLat", "22.1946");

// params.put("cityLng", "113.549");

params.put("positionArea", "");

params.put("positionId", "");

params.put("keyword", "");

params.put("hotelId", "");

params.put("htlPageView", "0");

params.put("hotelType", "F");

params.put("hasPKGHotel", "F");

params.put("requestTravelMoney", "F");

params.put("isusergiftcard", "F");

params.put("useFG", "F");

params.put("HotelEquipment", "");

params.put("priceRange", "-2");

params.put("hotelBrandId", "");

params.put("promotion", "F");

params.put("prepay", "F");

params.put("IsCanReserve", "F");

params.put("OrderBy", "99");

params.put("OrderType", "");

params.put("k1", "");

params.put("k2", "");

params.put("CorpPayType", "");

params.put("viewType", "");

// params.put("checkIn", "2016-11-24");

// params.put("checkOut", "2016-11-25");

params.put("DealSale", "");

params.put("ulogin", "");

params.put("hidTestLat", "0%7C0");

// params.put("AllHotelIds", "436450%2C371379%2C396332%2C419374%2C345805%2C436553%2C425997%2C436486%2C436478%2C344977%2C5605870%2C344983%2C371396%2C344979%2C2572033%2C699384%2C425795%2C419823%2C2010726%2C5772619%2C1181591%2C2005951%2C345811%2C371381%2C371377");// TODO

params.put("psid", "");

params.put("HideIsNoneLogin", "T");

params.put("isfromlist", "T");

params.put("ubt_price_key", "htl_search_result_promotion");

params.put("showwindow", "");

params.put("defaultcoupon", "");

params.put("isHuaZhu", "False");

params.put("hotelPriceLow", "");

params.put("htlFrom", "hotellist");

params.put("unBookHotelTraceCode", "");

params.put("showTipFlg", "");

// params.put("hotelIds", "436450_1_1,371379_2_1,396332_3_1,419374_4_1,345805_5_1,436553_6_1,425997_7_1,436486_8_1,436478_9_1,344977_10_1,5605870_11_1,344983_12_1,371396_13_1,344979_14_1,2572033_15_1,699384_16_1,425795_17_1,419823_18_1,2010726_19_1,5772619_20_1,1181591_21_1,2005951_22_1,345811_23_1,371381_24_1,371377_25_1");// TODO

params.put("markType", "1");

params.put("zone", "");

params.put("location", "");

params.put("type", "");

params.put("brand", "");

params.put("group", "");

params.put("feature", "");

params.put("equip", "");

params.put("star", "");

params.put("sl", "");

params.put("s", "");

params.put("l", "");

params.put("price", "");

params.put("a", "0");

params.put("keywordLat", "");

params.put("keywordLon", "");

params.put("contrast", "0");

params.put("page", page);

params.put("contyped", "0");

params.put("productcode", "");

String result = HttpUtil.getInstance().httpPost(hotelUrl, params);

// 数据中有转义符直接转JSON报错,所以这里重新拼接所需要的JSON数据

String tempHotel = result.substring(result.indexOf("hotelPositionJSON")-1, result.length());

// 确保截取到indexOf("biRecord"), 减2是因为需要]符号

String hotelArray = tempHotel.substring(0, tempHotel.indexOf("biRecord") - 2);

String tempTotalCount = result.substring(result.indexOf("hotelAmount")-1, result.length());

String totalCount = tempTotalCount.substring(0, tempTotalCount.indexOf(","));

StringBuffer sb = new StringBuffer();

sb.append("{");

sb.append(totalCount);

sb.append(",");

sb.append(hotelArray);

sb.append("}");

return sb.toString().replace("\\", "");

}

说明:这个方法对返回结果进行了操作,直接把hotelPositionJSON和hotelAmount的内容提取了出来(因为直接转换时发现数据中含有转义符导致转为JSON失败),操作后的数据格式为:

{

"hotelAmount": 11265,

"hotelPositionJSON": [ { "id": "6297824", "name": "北京浣川招待所", "lat": "39.918086", "lon": "116.427508", "url": "/hotel/6297824.html?isFull=F#ctm_ref=hod_sr_map_dl_txt_1", "img": "http://pic.c-ctrip.com/hotels110127/hotel_example.jpg", "address": "东城区东城区外交部街46号-1。 ( 北京站、建国门地区)", "score": "0.0", "dpscore": "0", "dpcount": "0", "star": "hotel_diamond01", "stardesc": "携程用户评定为1钻", "shortName": "", "isSingleRec": "false"}, { "id": "6298279", "name": "北京怀柔喇叭沟门海燕农家院", "lat": "40.956471", "lon": "116.513108", "url": "/hotel/6298279.html?isFull=F#ctm_ref=hod_sr_map_dl_txt_2", "img": "http://pic.c-ctrip.com/hotels110127/hotel_example.jpg", "address": "怀柔区黄甸子村。 ( 怀柔风景区)", "score": "0.0", "dpscore": "0", "dpcount": "0", "star": "hotel_diamond01", "stardesc": "携程用户评定为1钻", "shortName": "", "isSingleRec": "false"} ]}

3.循环遍历城市数据,查询每个城市的酒店即可

long startTime = System.currentTimeMillis();

HotelCitySpider citySpider = new HotelCitySpider();

HotelSpider spider = new HotelSpider();

List cities = citySpider.getHotelCities();

long getCityTime = System.currentTimeMillis();

System.out.println("获取城市所用时间(ms):" + (getCityTime - startTime));

spider.createTable();

for (HotelCity hotelCity : cities) {

spider.saveHotels(hotelCity, spider.getHotelList(hotelCity));

}

long saveHotelTime = System.currentTimeMillis();

System.out.println("获取酒店并存储所用时间(ms):" + (saveHotelTime - startTime));

这里我仍然将数据存储到数据库中

4.批量插入数据

/** * 保存每个城市的酒店列表 *@param city *@param hotels */

public void saveHotels(HotelCity city, List hotels) {

for (Hotel hotel : hotels) {

StringBuffer insert_sql = new StringBuffer();

insert_sql.append("insert into ctrip_hotel "

+ "(hotel_id, city_id, city_name, name, lat, lon, url, img, address, score, dpscore, dpcount, star, stardesc, shortName, isSingleRec) values (");

insert_sql.append("'" + hotel.getId() + "'");

insert_sql.append(", " + city.getCityId());

insert_sql.append(", '" + city.getCityName() + "'");

insert_sql.append(", '" + hotel.getName() + "'");

insert_sql.append(", " + hotel.getLat());

insert_sql.append(", " + hotel.getLon());

insert_sql.append(", '" + hotel.getUrl() + "'");

insert_sql.append(", '" + hotel.getImg() + "'");

insert_sql.append(", '" + hotel.getAddress() + "'");

insert_sql.append(", " + hotel.getScore());

insert_sql.append(", " + hotel.getDpscore());

insert_sql.append(", " + hotel.getDpcount());

insert_sql.append(", '" + hotel.getStar() + "'");

insert_sql.append(", '" + hotel.getStardesc() + "'");

insert_sql.append(", '" + hotel.getShortName() + "'");

insert_sql.append(", " + hotel.getIsSingleRec() + ")");

try {

preparedStatement = conn.prepareStatement(insert_sql.toString());

preparedStatement.execute();

} catch (Exception e) {

e.getMessage();

continue;

}

}

}

原本想批量插入,但是数据有重复的hotel_id,preparedStatement.executeBatch()会报错,所以还是一条条插入。

github源码地址 https://github.com/jianiuqi/CTripSpider

Java爬携程_Java数据爬取——爬取携程酒店数据(二)相关推荐

  1. java disruptor压测_Java并发框架Disruptor实现原理与源码分析(二) 缓存行填充与CAS操作...

    ##缓存行填充 关于缓存行填充在我个人的印象里面第一次看到是在Java的java.util.concurrent包中,因为当时很好奇其用法背后的逻辑,所以查了很多资料才明白到底是怎么回事*(也许事实上 ...

  2. java无极树形结构_Java爬虫框架:SeimiCrawler——结构化解析与数据存储

    本文将介绍如何使用SeimiCrawler将页面中信息提取为结构化数据并存储到数据库中,这也是大家非常常见的使用场景.数据抓取将以抓取博客园的博客为例. 建立基本数据结构 为了演示,简单起见只建立一个 ...

  3. java调用第三方接口_java调用第三方接口,获取接口返回的数据。

    java接收远程调用的数据,得到的是如上个数的返回内容,我怎么写才能获取到值,现在使用的请求方法如下: public static HttpResult postJsonData(String url ...

  4. java set集合元素_Java面试题10(如何取到set集合的第一个元素)

    1.如何取到set集合的第一个元素. public static voidmain(String[] args) { Set set= newHashSet(); set.add("xixi ...

  5. java模拟登陆系统_Java模拟登录系统抓取内容【转载】

    1 @Component2 public class Login extendsBaseJobs {3 4 SimpleDateFormat sdf = new SimpleDateFormat(&q ...

  6. java模拟银行存取_JAVA模拟银行存钱,取钱操作以及计算利息操作

    /* *程序的版权和版本声明部分: *程序的版权和版本声明部分: *Copyright(c)2013,烟台大学计算机学院学生 *All rights reserved. *文件名称: *作者:尚振伟 ...

  7. java csv 导入数据库_java – 如何上传CSV文件然后自动将数据插入数据库?

    我有基于 Java的Spring MVC应用程序,它也使用Spring安全性.我正在使用hibernate作为此Web应用程序的ORM工具. 以下是我的要求 – 用户可以使用Web浏览器上传CSV文件 ...

  8. java 辗转相除_Java实现辗转相除法并求取最大公约数、最小公倍数

    算法介绍 辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法. 它的具体做法是: 用较大数除以较小数,再用出现的余数(第一余数)去除除数, 再用出现的余 ...

  9. java 蚁群算法_Java蚁群算法(Ant Colony)求解旅行商问题(TSP)(二)

    算法准备 旅行商问题(TSP)是一个经典的图论问题.在给定一系列城市和他们之间的距离以后,一个旅行商人希望能够找到一条能够走遍所有城市,并返回起点城市的最短路径.既然路径能串起来所有的城市,那么问题中 ...

  10. ​携程网全国各城市酒店数据​评论数据

    数据说明: 携程网全国各城市酒店数据(含开业年份.装修年份.房间数.经纬度.评论数和评分.酒店全部图片.各房型的图片价格等等,详细见下面的字段说明部分),总计酒店基本信息735,476条,酒店图片98 ...

最新文章

  1. void*与int互转
  2. 在Dll中创建对话框并调用
  3. hibernate的缓存技术使用
  4. Eureka的服务自我保护
  5. java多级菜单列表怎么做_JAVA构造多级菜单
  6. linux远程日志rsyslog服务端和客户端安装(亲测)--自定义接收日志格式
  7. 关于mail-notification和apt-get
  8. createprocess 系统找不到指定的文件_告别文件混乱和找不到,文件管理的新思路...
  9. qualys java 误报_从拒绝到接受 解析漏洞管理的五个阶段
  10. Java核心技术读书笔记(2013-01-11)
  11. 啊哈算法-bfs-解救小哈
  12. QQ登录界面测试用例设计:
  13. 读书笔记 --- 组织结构设计
  14. 日常渗透刷洞的一些小工具
  15. PMP-总价合同、固定合同、工料合同对比
  16. 节能降耗 | AIRIOT智慧电力综合管理解决方案
  17. 马斯克推荐加密通讯聊天软件Signalv5.13.8跨平台国际版几何管家出品
  18. 关于AD9361的抗阻塞能力 的实测
  19. 鸿蒙 悟空 嫦娥,哪位女神在鸿蒙已得道,实力让孙悟空悚惧?
  20. 炼石荣登“中国信创500强”榜单

热门文章

  1. 24种常见的逻辑关系谬误
  2. sqLite数据库读C#
  3. Amazon Dynamo论文中文版
  4. PLC(二)西门子S7-200PLC基础知识
  5. 6.形容词性物主代词用法
  6. 计算机网卡实现的功能,网卡实现的主要功能是什么
  7. 图像坐标球面投影_图像の球面投影算法
  8. STM32开发环境搭建——Keil5
  9. 电脑端/手机端获取京东pt_key和pt_pin的几种方式
  10. python成品_京东抢购茅台Python打包版