使用Jsoup获取URL重定向目标URL失败的技术咨询
解决Jsoup无法获取重定向目标URL的问题
我太懂这个痛点了!Jsoup默认会自动跟随HTTP重定向,但如果你直接用Jsoup.connect(url).get().url(),得到的确实是你最初请求的原始URL,而不是最终跳转后的目标地址——这是因为Document对象里的url方法保存的是请求起始地址,不是最终响应的地址。
下面给你两种针对性的解决办法:
1. 处理HTTP层面的重定向(最常见情况)
不要直接调用get()或parse(),而是先通过execute()获取Response对象,它里面的url()方法会返回最终重定向后的地址:
// 替换成你的原始URL String originalUrl = "https://example.com/redirect"; Connection.Response response = Jsoup.connect(originalUrl) .followRedirects(true) // 这是Jsoup默认行为,可写可不写 .execute(); // 获取最终重定向后的目标URL String finalTargetUrl = response.url().toString(); // 如果还需要解析页面内容,直接从response生成Document Document doc = response.parse();
2. 处理客户端侧重定向(比如Meta Refresh、JS跳转)
如果遇到的是页面里的Meta标签跳转或者JavaScript跳转(不是HTTP 3xx状态码的重定向),Jsoup默认不会自动处理,这时候需要手动解析页面内容:
处理Meta Refresh跳转
Document doc = Jsoup.connect(originalUrl).get(); Element metaRefresh = doc.selectFirst("meta[http-equiv=refresh]"); if (metaRefresh != null) { String contentAttr = metaRefresh.attr("content"); if (contentAttr.contains("url=")) { String targetUrl = contentAttr.split("url=")[1].trim(); // 处理相对URL,转成绝对地址 if (!targetUrl.startsWith("http")) { targetUrl = doc.baseUri() + targetUrl; } // 这里的targetUrl就是跳转目标 } }
处理JS跳转(简单场景)
如果是JS里的window.location.href跳转,可以尝试提取对应的URL:
Document doc = Jsoup.connect(originalUrl).get(); Elements scriptTags = doc.select("script"); for (Element script : scriptTags) { String scriptContent = script.html(); if (scriptContent.contains("window.location.href")) { // 简单提取,复杂场景可能需要正则 int startIdx = scriptContent.indexOf("window.location.href = '") + 24; int endIdx = scriptContent.indexOf("'", startIdx); String targetUrl = scriptContent.substring(startIdx, endIdx); // 同样处理相对URL if (!targetUrl.startsWith("http")) { targetUrl = doc.baseUri() + targetUrl; } } }
先判断你的重定向类型是HTTP层面还是客户端侧,对应上面的方法就能拿到真正的目标URL啦!
内容的提问来源于stack exchange,提问作者webscrapingtech
相关产品推荐
相关产品推荐

