问题
HttpClients爬虫响应200,想要的数据获取不到
复现
private static void getInitData() throws IOException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpGet httpGet = new HttpGet(INIT_DATA_URL);
Header[] headers = {
new BasicHeader("cookie", session),
new BasicHeader("Host", Host),
new BasicHeader("Referer", Referer),
new BasicHeader("User-Agent", UserAgent),
new BasicHeader("Sec-Ch-Ua-Platform", Platform),
new BasicHeader("Sec-Fetch-Mode", Mode),
new BasicHeader("Sec-Fetch-Dest", Dest),
new BasicHeader("Accept", Accept)
};
// 设置headers
httpGet.setHeaders(headers);
CloseableHttpResponse response = httpClient.execute(httpGet);
log.info("获取信息: {} ", JSON.toJSONString(response));
}
}
获取不到想要的数据
解决
换成原生JDK
private static void getInitDataJdk() throws IOException {
URL url = new URL(INIT_DATA_URL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("cookie",session);
connection.setRequestProperty("Host", Host);
connection.setRequestProperty("Referer", Referer);
connection.setRequestProperty("User-Agent", UserAgent);
connection.setRequestProperty("Sec-Ch-Ua-Platform", Platform);
connection.setRequestProperty("Sec-Fetch-Mode", Mode);
connection.setRequestProperty("Sec-Fetch-Dest", Dest);
connection.setRequestProperty("Accept", Accept);
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
log.info("获取信息: {}", response.toString());
} else {
log.error("HTTP请求失败,状态码: {}", responseCode);
}
connection.disconnect();
}
返回正确
分析
这可能与两种不同的HTTP客户端库在处理HTTP请求和响应的方式有关。
- Apache HttpClient和HttpURLConnection在处理HTTP请求和响应时有一些细微的差异,包括头部处理、连接管理、重定向处理等方面。虽然两者都是用于发送HTTP请求和接收HTTP响应的工具,但它们的实现方式可能会导致在某些情况下产生不同的行为。
- 一种可能的情况是,服务器可能会根据不同的User-Agent头部(即请求中的浏览器标识)来提供不同的响应。在使用Apache HttpClient时,您可能会在User-Agent头部中设置了特定的值,而在使用HttpURLConnection时,可能没有设置或者设置了不同的值。服务器可能会根据这些不同的值来返回不同的响应。
- 此外,Apache HttpClient可能会自动处理一些重定向,而HttpURLConnection可能不会自动处理,需要手动处理。这也可能导致不同的行为。
- 要确切地了解为什么使用HttpURLConnection能够获取到数据,您可能需要进一步分析两种方式的请求和响应,包括头部信息、请求内容、响应内容等。