尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Jsoup 1.15.3 实战:5步构建携程酒店城市信息静态页面抓取器
Jsoup 1.15.3 实战5步构建携程酒店城市信息静态页面抓取器在当今数据驱动的商业环境中网页数据抓取已成为获取市场洞察的重要手段。对于旅游行业从业者而言准确掌握酒店分布和城市信息是业务决策的基础。本文将手把手教你用Java生态中最受欢迎的HTML解析库Jsoup 1.15.3构建一个高效的携程酒店城市信息抓取工具。1. 环境准备与项目初始化首先确保你的开发环境满足以下条件JDK 1.8或更高版本Maven 3.6IntelliJ IDEA或Eclipse IDE创建Maven项目并添加Jsoup依赖dependency groupIdorg.jsoup/groupId artifactIdjsoup/artifactId version1.15.3/version /dependency建议项目采用标准目录结构/src /main /java /com /yourcompany /ctrip CtripHotelParser.java HotelCity.java /resources /html_samples hotels.ctrip.html提示实际开发中建议使用Log4j2或SLF4J记录日志方便调试和问题追踪2. HTML文件解析基础Jsoup提供了多种解析HTML的方式对于本地文件解析我们主要使用Jsoup.parse()方法。创建基础解析工具类import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.File; import java.io.IOException; public class CtripHotelParser { public Document parseLocalHtml(String filePath) throws IOException { File input new File(filePath); return Jsoup.parse(input, UTF-8, https://hotels.ctrip.com); } // 测试方法 public static void main(String[] args) { try { CtripHotelParser parser new CtripHotelParser(); Document doc parser.parseLocalHtml(src/main/resources/html_samples/hotels.ctrip.html); System.out.println(页面标题: doc.title()); } catch (IOException e) { e.printStackTrace(); } } }关键参数说明filePath: HTML文件本地路径UTF-8: 指定文件编码基础URI: 用于解析相对路径设为携程酒店域名3. CSS选择器精确定位数据携程酒店城市页面通常采用类似以下结构div classcity-list dl classlayoutfix dtA/dt dd a href/hotel/beijing1>public ListHotelCity extractCities(Document doc) { ListHotelCity cities new ArrayList(); Elements cityGroups doc.select(dl.layoutfix); for (Element group : cityGroups) { Elements links group.select(a[href]); for (Element link : links) { HotelCity city new HotelCity(); city.setCityName(link.text()); city.setUrl(link.attr(href)); city.setCityId(link.attr(data-id)); cities.add(city); } } return cities; }常用CSS选择器模式tag#id: 通过ID选择元素tag.class: 通过类名选择[attribute]: 通过属性选择parent child: 直接子元素选择4. 数据封装与清洗创建HotelCity实体类封装数据public class HotelCity { private String cityId; private String cityName; private String url; private String pinyin; // getters setters public String extractPinyinFromUrl() { // 从URL中提取拼音部分如/hotel/beijing1 - beijing if(url ! null url.split(/).length 2) { String pinyinPart url.split(/)[2]; return pinyinPart.replaceAll([^a-zA-Z], ); } return null; } }数据清洗关键点去除空白字符String.trim()正则表达式过滤replaceAll([^a-zA-Z], )URL补全处理public String getFullUrl() { if(url ! null !url.startsWith(http)) { return https://hotels.ctrip.com url; } return url; }5. 完整项目实现与优化整合各模块的完整实现public class CtripHotelCrawler { private static final Logger logger LoggerFactory.getLogger(CtripHotelCrawler.class); public ListHotelCity crawlCityData(String htmlFilePath) { try { // 1. 解析HTML Document doc new CtripHotelParser().parseLocalHtml(htmlFilePath); // 2. 提取数据 ListHotelCity cities new CityDataExtractor().extractCities(doc); // 3. 数据后处理 cities.forEach(city - { city.setPinyin(city.extractPinyinFromUrl()); city.setUrl(city.getFullUrl()); }); logger.info(成功抓取{}个城市数据, cities.size()); return cities; } catch (Exception e) { logger.error(抓取城市数据失败, e); return Collections.emptyList(); } } // 导出为CSV的实用方法 public void exportToCsv(ListHotelCity cities, String outputPath) { try (PrintWriter writer new PrintWriter(new File(outputPath))) { writer.println(城市ID,城市名称,拼音,URL); cities.forEach(city - writer.println( String.join(,, city.getCityId(), city.getCityName(), city.getPinyin(), city.getUrl() ) )); } catch (FileNotFoundException e) { logger.error(导出CSV失败, e); } } }性能优化建议使用连接池处理多个HTML文件采用并行流处理大数据量cities.parallelStream()添加缓存机制避免重复解析实际项目中我曾遇到城市数据分散在多个div块中的情况通过调整CSS选择器为div.city-list dl.layoutfix解决了定位不准的问题。对于动态加载的内容可以考虑结合Selenium等工具先获取完整HTML再解析。掌握这些技巧后你可以轻松扩展此项目来抓取酒店详情、用户评价等更多有价值的数据为业务决策提供数据支持。
RELATED

相关推荐

2026年6月GESP真题及题解(C++八级):堆石子

2026年6月GESP真题及题解(C++八级):堆石子

2026年6月GESP真题及题解(C八级):堆石子 题目描述 有 mmm 堆石子,编号为 1,2,⋯,m1, 2, \cdots, m1,2,⋯,m,其石子数量分别记为 a1,a2,⋯,ama_1, a_2, \cdots, a_ma1​,a2​,⋯,am​。 现在要求第 111 堆石子恰有 nn…

📅 2026/10/9 21:04:33
AI让模糊变高清!这款神器图片视频一键超分,老片也能变4K!

AI让模糊变高清!这款神器图片视频一键超分,老片也能变4K!

翻出十年前的老照片,模糊到看不清人脸?下载的经典电影只有720P,在大屏电视上马赛克满满?收藏的GIF表情包分辨率太低,发朋友圈都嫌糊?更崩溃的是,网上找到的"AI放大工具"要么收费昂贵&…

📅 2026/10/6 7:17:55
运放零偏伺服电路设计:从LTspice仿真到实际电路振荡的2个关键调试步骤

运放零偏伺服电路设计:从LTspice仿真到实际电路振荡的2个关键调试步骤

运放零偏伺服电路设计:从LTspice仿真到实际电路振荡的2个关键调试步骤 在模拟电路设计中,运放零偏伺服电路是一个既基础又关键的技术环节。许多工程师在LTspice仿真阶段能够获得理想结果,但一旦转移到实际PCB上,往往会遇到意想不到…

📅 2026/10/22 12:28:56
MORE NEWS

更多资讯

📰

Oracle EBS ASCP高级供应链计划实战:多工厂手机制造案例配置与验收

简介:这份文档面向 Oracle EBS 供应链与计划模块的实施顾问、ERP 运维人员及学习高级计划排程的从业者,以一家手机制造企业的完整案例为线索,系统梳理 ASCP 方案的搭建与测试流程。内容从物料定义与组织分配、BOM 与工艺路线设置,…

📰

AI简历优化指南:用STAR法则与关键词匹配写出可核验简历

一个做数据分析的朋友上周把简历发我,说用AI改了三版,投出去连电话都没接到几个。我打开一看就明白了:每一句都长得像年终总结,"主导跨部门协同""赋能业务闭环""有效提升整体效率",通篇…

📰

AI宇宙学家:大模型驱动的天文数据分析系统

1. 项目背景与核心价值 去年在参加一场天体物理学术会议时,我注意到一个有趣的现象:超过60%的参会者都在抱怨数据处理消耗了太多研究时间。一位博士后甚至开玩笑说"我们花在清洗数据上的时间比陪家人还多"。这让我开始思考——在大模型技术突飞…

📰

企业短信接口对接十步法及常见陷阱解析

1. 短信接口对接的行业现状与痛点 短信接口对接是企业信息化建设中最基础却最容易出问题的环节之一。根据我过去五年参与过的47个企业级项目统计,首次对接短信接口的成功率不足60%,而因短信验证码失效导致的用户流失占比高达23%。这个看似简单的技术环节…

📰

分步傅里叶法解NLS:算子分裂原理与MATLAB实现

简介:面向非线性光纤光学与数值仿真方向的学习者,这份资源提供用分步傅里叶法求解非线性薛定谔方程(NLS)的完整源代码解析,适合已具备Matlab基础、希望理解光脉冲在光纤中传输演化过程的高年级本科生与研究生。内容围绕…

📰

高效自习室选择与使用全攻略

1. 自习室选择的核心考量因素 作为一名经历过高中三年自习室踩坑的老司机,我深刻理解选择一个优质自习室对学习效率的影响。好的自习室环境能提升30%以上的学习专注度,而糟糕的环境则可能让你白白浪费宝贵的时间。经过实地考察和长期体验,我总…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬