Java数据爬取——爬取携程酒店数据(一)

最近工作要收集点酒店数据,就到携程上看了看,记录爬取过程去下

1.根据城市名称来分类酒店数据,所以先找了所有城市的名称
在这个网页上有http://hotels.ctrip.com/domestic-city-hotel.html

这里写图片描述

从网站地图上可以很容易发现这个页面

2.然后查看源码

这里写图片描述

发现所有需要的数据都在

<dl class = "pinyin_filter_detail layoutfix"></dl>

3.我们获取一下dl 这个元素和其中的所有子元素

我们用jsoup的jar包来解析获取的html,官网https://jsoup.org/,有API和jar包

String result = HttpUtil.getInstance().httpGet(null, "http://hotels.ctrip.com/domestic-city-hotel.html");
Document root_document = Jsoup.parse(result);
Elements pinyin_filter_elements = root_document.getElementsByClass("pinyin_filter_detail layoutfix");

//包含所有城市的Element
Element pinyin_filter = pinyin_filter_elements.first();

4.我准备把获取的城市数据存储到mysql中,所以下面连接了本地mysql数据库

// 连接数据库
Connection conn = SqlDBUtils.getConnection();
StringBuilder create_table_sql = new StringBuilder();
create_table_sql.append("create table if not exists ctrip_hotel_city (id integer primary key auto_increment, city_id integer not null, city_name varchar(255) not null, head_pinyin varchar(80) not null, pinyin varchar(255) not null)");
PreparedStatement preparedStatement;
try {
    //每次执行删除一下表,防止数据插入重复
    preparedStatement = conn.prepareStatement("DROP TABLE IF EXISTS ctrip_hotel_city");
    preparedStatement.execute();
    // 创建ctrip_hotel_city表,存储城市数据
    preparedStatement = conn.prepareStatement(create_table_sql.toString());
    preparedStatement.execute();
} catch (SQLException e) {
    e.printStackTrace();
}

5.获取dl下所有的dt和dd,并从中提取数据库表中所需要的字段,实现存储

//拼音首字符Elements
Elements pinyins = pinyin_filter.getElementsByTag("dt");
//所有dd的Elements
Elements hotelsLinks = pinyin_filter.getElementsByTag("dd");

6.数据提取

for (int i = 0; i < pinyins.size(); i++) {
    Element head_pinyin = pinyins.get(i);
    Element head_hotelsLink = hotelsLinks.get(i);
    Elements links = head_hotelsLink.children();
    for (Element link : links) {
        String cityId = StringUtil.getNumbers(link.attr("href"));
        String cityName = link.html();
        String head_pinyin_str = head_pinyin.html();
        String pinyin_cityId = link.attr("href").replace("/hotel/", "");
        String pinyin = pinyin_cityId.replace(StringUtil.getNumbers(link.attr("href")), "");
        StringBuffer insert_sql = new StringBuffer();
        insert_sql.append("insert into ctrip_hotel_city (city_id, city_name, head_pinyin, pinyin) values (");
        insert_sql.append(cityId);
        insert_sql.append(", '" + cityName + "'");
        insert_sql.append(", '" + head_pinyin_str + "'");
        //此处注意汉语拼音中会有',直接插入数据库会报错,要把一个'替换为两个''
        insert_sql.append(", '" + pinyin.replace("'", "''") + "')");
        try {
            preparedStatement = conn.prepareStatement(insert_sql.toString());
            preparedStatement.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

7.运行后查看mysql数据库ctrip_hotel_city表,如下

这里写图片描述

至此,酒店城市获取思路已介绍完毕,下面将介绍怎么用城市获取城市所有酒店的数据,
github源码地址 https://github.com/jianiuqi/CTripSpider
博文Java数据爬取——爬取携程酒店数据(二) 中介绍了如何利用地区爬取酒店数据,并保存到了mysql数据库

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在上一篇文章中,我们介绍了如何通过Java代码模拟浏览器行为来爬取携程网站上的酒店列表数据。本篇文章将继续介绍如何通过Java代码获取酒店详情页面的数据。 1. 获取酒店详情页面URL 在上一篇文章中,我们已经可以获取到酒店列表页面的数据。接下来,我们需要从列表页面中获取每个酒店的详情页面URL。我们可以通过以下代码来获取URL: ```java // 获取酒店详情页面URL Elements hotelLinks = doc.select(".hotel_item a[href^=//hotels.ctrip.com/hotel/]"); for (Element link : hotelLinks) { String href = link.attr("href"); hotelUrls.add("http:" + href); } ``` 这里我们使用了Jsoup框架提供的选择器功能,选取class为“hotel_item”的元素,然后再选取其中的a标签,并且href属性值以“//hotels.ctrip.com/hotel/”开头的元素。然后再遍历这些元素,获取其中的href属性值并加上“http:”前缀,即是酒店详情页面的URL。 2. 解析酒店详情页面数据 获取到酒店详情页面的URL后,我们需要再次模拟浏览器行为,访问该URL并获取页面数据。我们可以通过以下代码来实现: ```java // 获取酒店详情页面数据 for (String url : hotelUrls) { Document hotelDoc = Jsoup.connect(url).userAgent(USER_AGENT).get(); String hotelName = hotelDoc.select(".hotel_intro dt").text(); String address = hotelDoc.select(".hotel_address a").text(); String score = hotelDoc.select(".hotel_score .score_num").text(); String commentNum = hotelDoc.select(".hotel_judgement .hotel_judgement_judgement").text(); String price = hotelDoc.select(".hotel_intro .hotel_price span").text(); hotels.add(new Hotel(hotelName, address, score, commentNum, price)); } ``` 这里我们同样使用了Jsoup框架来获取页面数据。首先,我们遍历所有酒店详情页面的URL,然后通过Jsoup.connect()方法连接到该URL并获取页面数据。接着,我们使用选择器选取需要的元素,例如酒店名称、地址、评分、评论数和价格等,并将其保存到一个自定义的Hotel对象中。最后,我们将所有的Hotel对象添加到一个列表中,以便后续的数据处理。 3. 数据保存 获取到所有酒店数据后,我们可以将其保存到本地文件中,也可以将其保存到数据库中。这里我们使用了JDBC连接MySQL数据库,并将数据保存到一个名为“hotels”的表中。以下是保存数据的代码: ```java // 保存酒店数据数据库 Connection conn = null; PreparedStatement stmt = null; try { Class.forName(JDBC_DRIVER); conn = DriverManager.getConnection(DB_URL, USER, PASS); String sql = "INSERT INTO hotels (name, address, score, comment_num, price) VALUES (?, ?, ?, ?, ?)"; stmt = conn.prepareStatement(sql); for (Hotel hotel : hotels) { stmt.setString(1, hotel.getName()); stmt.setString(2, hotel.getAddress()); stmt.setString(3, hotel.getScore()); stmt.setString(4, hotel.getCommentNum()); stmt.setString(5, hotel.getPrice()); stmt.executeUpdate(); } } catch (SQLException se) { se.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (stmt != null) stmt.close(); } catch (SQLException se2) { } try { if (conn != null) conn.close(); } catch (SQLException se) { se.printStackTrace(); } } ``` 这里我们使用了JDBC框架来连接数据库,并执行SQL语句将酒店数据保存到数据库中。最后,我们需要在finally块中关闭数据库连接和语句对象,以释放资源。 总结 本篇文章介绍了如何通过Java代码获取携程网站上的酒店详情页面数据,并将其保存到MySQL数据库中。这个过程涉及到了许多技术,例如模拟浏览器行为、页面数据解析、数据库连接等。通过这个案例,我们可以更好地理解Java爬虫的实现原理和技术要点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值