Jsoup代码本地可正常访问URL 服务器部署后报HttpStatusException如何解决?
Jsoup请求跨环境运行异常排查方案
你遇到的org.jsoup.HttpStatusException异常本质是目标站点返回了非200系列的HTTP状态码,不同环境运行效果不一致的常见原因及解决方案如下:
- 目标站点反爬策略拦截云服务器IP
大部分站点的反爬规则会默认拦截云厂商的服务器IP段,你本地使用的家用宽带IP不在拦截名单内可正常访问,服务器IP被识别为爬虫来源直接返回403/404等错误码。你可以尝试替换代理节点、使用动态住宅IP代理解决。 - 请求头配置缺失
本地运行时Jsoup会自动继承系统的浏览器特征请求头,部署到服务器后默认请求头可能缺少User-Agent、Accept等字段,被站点识别为爬虫拦截。可以在请求中补充模拟浏览器的请求头:val document = Jsoup .connect("http://waipian3.com/search-%E4%BD%A0----------1---/") .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") .followRedirects(true) .get() - 服务器网络出站限制
先登录服务器执行curl命令验证网络连通性,确认安全组、防火墙是否开放了80端口出站权限,以及DNS解析是否正常:
如果curl也无法正常返回页面内容,说明是服务器网络层面的问题,需要调整服务器网络配置。curl -v "http://waipian3.com/search-%E4%BD%A0----------1---/" - 代理配置失效
确认代码中配置的代理在服务器环境下可正常连通,代理出口IP未被目标站点封禁,Jsoup代理配置示例如下:// 无账号密码代理 .proxy("代理IP", 代理端口) // 带账号密码代理 .proxy("代理IP", 代理端口) .header("Proxy-Authorization", "Basic " + Base64.getEncoder().encodeToString("账号:密码".toByteArray()))
你可以在捕获异常时打印具体的HTTP状态码和返回内容,快速定位问题:
try { // 你的请求代码 } catch (e: org.jsoup.HttpStatusException) { println("异常状态码:${e.statusCode}") println("站点返回内容:${e.response?.body()}") }
内容的提问来源于stack exchange,提问作者pnkj
相关产品推荐
相关产品推荐

