You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从HttpResponse获取完整响应体?爬虫遇SPA内容缺失怎么办?

网络爬虫实现问题:HttpResponse获取响应体的实践分析

当前代码实现

package org.degoogle.Networking;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.Optional;

public class HTTPComms {

    private static final HttpClient HTTP_CLIENT = HttpClient.newBuilder().connectTimeout(Duration.of(10, ChronoUnit.SECONDS)).build();

    // 404返回空,否则返回响应体
    public Optional<String> urlBodyGetter(String url) {
        try{

            HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).timeout(Duration.of(10, ChronoUnit.SECONDS)).GET().build();
            HttpResponse<String> response = HTTP_CLIENT.send(request, HttpResponse.BodyHandlers.ofString());
            if(response.statusCode() == 200){
                return Optional.of(response.body());
            } else{
                return Optional.empty();
            }
        }

        catch (Exception e) {

            if(e instanceof InterruptedException)
            {
                Thread.currentThread().interrupt();
                // 中断日志

            }
            else if(e instanceof IllegalArgumentException) {
                // URI错误日志
            }
            else{
                // IO阻塞日志
            }

            return Optional.empty();

        }
    }
}

问题现象

该代码在部分网站能正常返回完整HTML内容,示例输出:

<!doctype html>  
<html lang="en">  
<head>  
<meta charset="UTF-8" />  
<link rel="icon" type="image/svg+xml" href="/knight.svg" />  
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<title>Knights Time</title>    
<script    
  data-goatcounter="https://xyz.goatcounter.com/count"    
  async    
  src="//gc.zgo.at/count.js">  </script>    
<script type="module" crossorigin src="/knightsTime/assets/index-B0Z7CBXE.js"></script>  <link rel="stylesheet" crossorigin href="/knightsTime/assets/index-CZBET73t.css">  

</head>  
<body>  
<div id="root"></div>  
</body>  
</html>

但在部分网站仅返回包含<div id="root">的空结构。

当前实现的实践评估

当前实现只能算基础可用,离专业爬虫的良好实践有明显差距:

  • 请求头缺失:未设置User-Agent、Accept等浏览器常用请求头,容易被网站识别为爬虫,返回极简内容或拒绝服务。
  • 状态码处理单一:仅判断状态码200就返回内容,忽略了200系列其他有效状态码,也未针对4xx、5xx等异常状态码做差异化处理。
  • 错误处理不完善:仅做了异常类型分支判断,但未实现实际的日志记录,不利于后续问题排查。
  • 无法处理动态渲染内容:返回空root的网站大多是SPA(单页应用),页面内容需通过JavaScript动态加载,当前代码只能获取服务器返回的初始静态HTML,无法拿到渲染后的实际内容。
  • 缺乏反爬应对机制:没有设置请求间隔、代理IP池等,频繁请求易被目标网站封禁IP。

改进方向

  1. 添加模拟浏览器的请求头:构建HttpRequest时,通过header()方法添加User-Agent(模拟Chrome、Firefox等主流浏览器)、Accept、Accept-Language等字段,让请求更接近正常用户访问。
  2. 完善状态码处理:除200外,可处理201、204等状态码;针对403、404、503等异常状态码,记录对应日志并执行重试或跳过逻辑。
  3. 实现完整日志记录:使用SLF4J、Logback等日志框架,在异常分支中记录异常信息、请求URL等关键数据,方便调试。
  4. 处理动态渲染内容:爬取SPA网站时,可结合Selenium、Playwright等工具模拟浏览器加载页面并执行JavaScript,获取渲染后的完整HTML;或直接调用网站的API接口获取结构化数据。
  5. 遵守爬虫规范:读取目标网站的robots.txt文件,遵循爬取规则;设置合理请求间隔,避免对目标服务器造成压力;必要时使用代理IP池分散请求来源。

学习资源

  • Java官方HttpClient API文档:系统学习Java原生HttpClient的配置、请求构建、响应处理等细节。
  • Jsoup官方教程:掌握使用Jsoup解析HTML、提取数据的方法,适用于静态页面处理。
  • 网络爬虫反爬策略资料:学习常见反爬手段(如UA校验、IP封禁、验证码)及应对方法。
  • SPA爬取技术文档:了解Selenium、Playwright等工具的使用,掌握动态页面爬取的实现方式。

内容的提问来源于stack exchange,提问作者Cola Eater

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 14:34:51