为什么Java代码读取部分HTTPS页面时报HTTP 403响应码错误?
问题产生原因
- 反爬策略拦截:research.investors.com站点部署了反爬机制,Java原生HTTP客户端默认的请求特征(比如自带的
User-Agent值为Java/版本号)会被直接识别为爬虫,返回403拒绝访问;而maven.apache.org没有这类严格的反爬校验,所以可以正常访问。 - 请求头缺失:目标站点会校验
User-Agent、Accept、Accept-Language等常规浏览器请求头,缺少这些头的请求会被判定为非法请求。 - Cookie校验缺失:部分站点首次访问会下发会话Cookie,后续请求需要携带对应Cookie才能正常访问,Java原生客户端默认不会自动处理Cookie。
- TLS指纹校验:部分站点的WAF会校验TLS握手阶段的客户端指纹,Java原生HTTP客户端的TLS指纹和普通浏览器差异较大,容易被识别拦截。
解决方法
方案1:补充合法请求头(适配原生HttpURLConnection)
主动添加浏览器标准请求头,核心是替换默认的User-Agent为真实浏览器的标识,同时开启自动Cookie处理:
import java.net.*; import java.io.*; import java.nio.charset.StandardCharsets; // 全局启用自动Cookie处理 CookieManager cookieManager = new CookieManager(); CookieHandler.setDefault(cookieManager); URL url = new URL("https://research.investors.com/stock-quotes/nyse-sailpoint-tech-holdings-sail.htm"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 模拟Chrome浏览器的请求头 conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"); conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); conn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); conn.setRequestProperty("Connection", "keep-alive"); // 读取响应逻辑 try (InputStream is = conn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { String line; StringBuilder content = new StringBuilder(); while ((line = reader.readLine()) != null) { content.append(line); } System.out.println(content); } finally { conn.disconnect(); }
方案2:更换成熟HTTP客户端(推荐)
如果原生客户端还是被拦截,推荐使用OkHttp等工业级HTTP客户端,它的TLS指纹更接近真实浏览器,且原生支持自动Cookie管理、连接池等能力,被拦截的概率更低。
首先添加Maven依赖:
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> </dependency>
调用示例:
import okhttp3.*; import java.net.CookieManager; OkHttpClient client = new OkHttpClient.Builder() .cookieJar(new JavaNetCookieJar(new CookieManager())) .build(); Request request = new Request.Builder() .url("https://research.investors.com/stock-quotes/nyse-sailpoint-tech-holdings-sail.htm") .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") .build(); try (Response response = client.newCall(request).execute()) { if (response.isSuccessful()) { String htmlContent = response.body().string(); // 处理返回的页面内容 } }
提示:请严格遵守目标站点的使用条款和robots.txt规则,控制请求频率,避免对站点服务造成不必要的压力。
内容的提问来源于stack exchange,提问作者alin
相关产品推荐
相关产品推荐

