当前位置: 首页 > news >正文

避坑指南:用Jsoup解析携程旅游网时,如何正确提取链接、图片和CSS?

Jsoup实战:精准解析旅游网站数据的避坑指南

1. 为什么选择Jsoup处理旅游网站数据?

旅游网站通常包含大量动态生成的HTML内容,页面结构复杂且嵌套层级深。以携程为例,一个酒店列表页可能包含数百个酒店卡片,每个卡片又包含图片、链接、价格、评分等多种元素。传统正则表达式难以应对这种场景,而Jsoup凭借其CSS选择器语法和DOM操作能力,成为处理这类问题的利器。

我在去年参与的一个酒店比价项目中,最初尝试用正则表达式提取携程数据,结果代码维护成本极高。后来切换到Jsoup后,解析代码量减少了70%,而稳定性提升了数倍。下面这段代码展示了最基本的页面加载方式:

// 从本地文件加载HTML(适合开发阶段调试) Document doc = Jsoup.parse(new File("ctrip.html"), "UTF-8"); // 从URL直接加载(生产环境使用) Document doc = Jsoup.connect("http://hotels.ctrip.com").get();

提示:开发阶段建议先将页面保存到本地文件进行解析测试,可以避免频繁请求网站导致IP被封。

2. 核心元素提取技巧

2.1 链接提取的陷阱与解决方案

旅游网站中的链接通常有三种形式:

  1. 绝对路径(如http://hotels.ctrip.com/hotel/beijing
  2. 根相对路径(如/hotel/beijing
  3. 相对路径(如../hotel/beijing

常见错误是直接使用select("a[href]")而不处理路径问题,导致后续请求失败。正确的做法是:

Elements links = doc.select("a[href]"); for (Element link : links) { String absoluteUrl = link.attr("abs:href"); // 关键点 System.out.println("完整URL: " + absoluteUrl); }

下表对比了三种路径处理方式:

方法示例输入输出结果适用场景
attr("href")/hotel/beijing/hotel/beijing需要原始路径时
attr("abs:href")/hotel/beijinghttp://hotels.ctrip.com/hotel/beijing需要发起后续请求时
absUrl("href")../hotel/beijinghttp://hotels.ctrip.com/hotel/beijing处理相对路径时

2.2 图片资源的正确抓取方式

旅游网站尤其重视图片展示,但图片URL往往有以下特点:

  • 使用CDN加速
  • 动态生成缩略图
  • 延迟加载(lazy load)

典型错误案例

// 这样会漏掉延迟加载的图片 Elements imgs = doc.select("img[src]");

改进方案

// 同时匹配src和data-src属性 Elements imgs = doc.select("img[src], img[data-src]"); for (Element img : imgs) { String imgUrl = img.hasAttr("data-src") ? img.attr("abs:data-src") : img.attr("abs:src"); System.out.println("图片URL: " + imgUrl); }

3. 高级选择器技巧

3.1 处理动态生成的CSS和JS

现代旅游网站大量使用动态加载的CSS和JS资源,这些资源通常通过link标签引入:

Elements cssLinks = doc.select("link[href][rel=stylesheet]"); Elements jsScripts = doc.select("script[src]"); // 提取并转换为绝对路径 List<String> resources = new ArrayList<>(); cssLinks.forEach(link -> resources.add("CSS: " + link.attr("abs:href"))); jsScripts.forEach(script -> resources.add("JS: " + script.attr("abs:src")));

3.2 精准定位特定区域的内容

以携程酒店列表页为例,我们需要定位到每个酒店卡片,然后提取其中的详细信息:

// 定位酒店卡片容器 Elements hotelCards = doc.select(".hotel_item"); hotelCards.forEach(card -> { String name = card.select(".hotel_name a").text(); String price = card.select(".price .num").text(); String score = card.select(".hotel_value").text(); System.out.printf("酒店: %s, 价格: %s, 评分: %s%n", name, price, score); });

4. 性能优化与反爬应对

4.1 选择器性能对比

不同选择器的执行效率差异很大,特别是在处理大型页面时:

  1. 低效选择器doc.select("div ul li a")
  2. 高效选择器doc.select("div.list > ul > li > a")

注意:避免使用过于通用的选择器如div a,这会强制Jsoup遍历整个DOM树。

4.2 模拟浏览器行为

旅游网站通常会检测爬虫行为,我们可以通过设置请求头来模拟浏览器:

Connection conn = Jsoup.connect("http://hotels.ctrip.com"); conn.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); conn.header("Accept-Language", "zh-CN,zh;q=0.9"); Document doc = conn.get();

4.3 异常处理最佳实践

稳定的爬虫需要完善的异常处理机制:

try { Document doc = Jsoup.connect(url) .timeout(10000) .get(); } catch (IOException e) { // 记录失败URL以便重试 logger.error("请求失败: " + url, e); // 实现指数退避重试机制 Thread.sleep((long) Math.pow(2, retryCount) * 1000); }

在实际项目中,我建议将这些技巧封装成工具类。比如创建一个WebScraper类,内部实现自动重试、请求间隔控制等功能,而不是在每个爬虫中重复实现这些逻辑。

http://www.jsqmd.com/news/565875/

相关文章:

  • 总结儿童用防误触插座品牌排名,选哪家更放心? - myqiye
  • VHDL编程避坑指南:顺序语句(IF/CASE/LOOP)在Process里到底怎么用?
  • 分析有实力的美国移民公司,上海加凯出国性价比如何,费用多少 - 工业品牌热点
  • 别再死记硬背了!用Python可视化帮你彻底搞懂拉格朗日、柯西中值定理
  • 从零开始:Nunchaku FLUX.1-dev在ComfyUI中的完整部署流程
  • 2026年茅台回收服务推荐:爱收酒专业回收陈年茅台、老茅台,上门回收更便捷 - 品牌推荐官
  • 收藏!小白程序员必看:Agent和工作流是最佳拍档,教你如何协同它们(附案例)
  • sts token
  • 最新防脱成分安全功效双维度排行榜:新型成分乌诺地尔上榜了 - 速递信息
  • DeepSeek-OCR多语言文档处理实战:联合国文件翻译自动化流程
  • 春季2021亚马逊研究奖获奖者公布
  • Phi-4-mini-reasoning 128K上下文实战:跨章节教材内容关联推理演示
  • 李松全域营销方案,让疗愈馆月投 1 万撬动年销 460 万! - 博客万
  • 2026年武汉油烟管道清洗、地毯清洗服务深度盘点:如何甄选专业可靠的合作伙伴? - 2026年企业推荐榜
  • 愿做一束光,照亮前路,温暖家国
  • 2025-2026年国内充电桩厂家推荐:TOP10口碑产品评测对比顶尖 - 品牌推荐
  • 张雪摩托
  • 分析实力强的B2C全渠道销售管理平台开发机构,北京哪家值得选 - mypinpai
  • 2025-2026年国内充电桩厂家推荐:十家口碑产品评测对比知名领先 - 品牌推荐
  • 2026年河南电气防爆认证公司推荐:南阳中测防爆电气有限公司,提供第三方/控制箱/风机/设备/南阳/cnex/摄像仪/电气/ccc防爆认证一站式服务 - 品牌推荐官
  • Hunyuan-MT-7B保姆级教程:Pixel Language Portal在树莓派5上的轻量级翻译终端部署
  • 告别手动刷鱼!用Python+ADB给COC部落冲突写个‘智能侦察兵’(附完整源码与防封指南)
  • 如何选择充电桩厂家?2026年3月推荐评测口碑对比知名TOP10z指南 - 品牌推荐
  • 真正懂防脱的人,选防脱洗发水只看这一个成分 - 速递信息
  • 2026年京津冀好用的文博数字化方案推荐,助力企业数字化转型 - 工业设备
  • 2048 城市形态指标(1992-2024)
  • 2026年太赫兹生物兆能仪厂家推荐:河南七道健康科技研究院,赫兹超能仪/太赫兹水仪全系供应 - 品牌推荐官
  • YOLO12开源模型合规部署:离线环境+审计日志+模型版本固化方案
  • 微信立减金(电子)别浪费,拆解5种回收方式 - 淘淘收小程序
  • 3个步骤掌握Markmap:将Markdown转换为交互式思维导图完全指南