Java HttpClient实现简单网络爬虫

今天我将使用Java的HttpClient(在Java 11及以上版本中内置)来编写一个入门级的网络爬虫示例。

这个示例将演示如何发送HTTP GET请求,获取响应内容,并处理可能出现的异常。

以下是一个基于Java HttpClient(Java 11+)的网络爬虫基础实现示例,包含详细注释和异常处理:

java 复制代码
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
​
public class WebCrawlerExample {
​
    public static void main(String[] args) {
        // 目标URL(请替换为实际需要爬取的网站)
        String targetUrl = "https://example.com";
​
        try {
            String htmlContent = fetchHtmlContent(targetUrl);
            System.out.println("网页内容获取成功!");
            System.out.println("获取内容长度:" + htmlContent.length() + " 字符");
            
            // 这里可以添加内容解析逻辑
            // parseHtml(htmlContent);
            
        } catch (Exception e) {
            System.err.println("爬取失败: " + e.getMessage());
        }
    }
​
    /**
     * 使用HttpClient获取网页HTML内容
     * @param url 目标网址
     * @return 网页HTML字符串
     * @throws Exception 网络请求异常
     */
    private static String fetchHtmlContent(String url) throws Exception {
        // 1. 创建HttpClient实例
        HttpClient client = HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_2)  // 使用HTTP/2协议
                .connectTimeout(Duration.ofSeconds(10)) // 设置连接超时
                .followRedirects(HttpClient.Redirect.NORMAL) // 跟随重定向
                .build();
​
        // 2. 构建HTTP请求
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .timeout(Duration.ofSeconds(15)) // 设置请求超时
                .header("User-Agent", "Mozilla/5.0 (compatible; MyCrawler/1.0)") // 设置UA标识
                .header("Accept", "text/html") // 指定接受HTML内容
                .GET() // GET请求
                .build();
​
        // 3. 发送请求并获取响应
        HttpResponse<String> response = client.send(
                request, 
                HttpResponse.BodyHandlers.ofString()
        );
​
        // 4. 检查HTTP状态码
        int statusCode = response.statusCode();
        if (statusCode != 200) {
            throw new RuntimeException("HTTP错误状态码: " + statusCode);
        }
​
        // 5. 返回HTML内容
        return response.body();
    }
    
    /**
     * (示例)HTML内容解析方法
     * @param html 网页HTML内容
     */
    /*
    private static void parseHtml(String html) {
        // 实际项目中可使用Jsoup等库解析HTML
        System.out.println("解析HTML...");
        // 示例:简单提取标题
        String title = html.substring(
            html.indexOf("<title>") + 7, 
            html.indexOf("</title>")
        );
        System.out.println("网页标题: " + title);
    }
    */
}

关键组件说明:

  1. HttpClient - Java 11+ 内置的HTTP客户端

    • 支持HTTP/2和WebSocket
    • 异步/同步两种请求模式
    • 超时控制机制
  2. 请求配置:

    • User-Agent:标识爬虫身份(建议遵守robots.txt规则)
    • timeout:防止长时间阻塞
    • 自动重定向处理
  3. 异常处理:

    • 连接超时
    • HTTP错误状态码(非200)
    • 网络中断
    • URL格式错误
  4. 扩展建议:

    less 复制代码
    // 在HttpClient构建器中可添加:
    .proxy(ProxySelector.of(new InetSocketAddress("proxy.com", 8080))) // 设置代理
    .authenticator(Authenticator.getDefault()) // 认证支持
    ​
    // 异步请求示例:
    client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
         .thenApply(HttpResponse::body)
         .thenAccept(System.out::println);

使用注意事项:

  1. 遵守robots.txt:

    • 检查目标网站/robots.txt的爬取规则
    • 例如:https://example.com/robots.txt
  2. 频率限制:

    • 在循环请求时添加延迟:
    scss 复制代码
    Thread.sleep(1000); // 每次请求间隔1秒
  3. 内容解析:

    • 建议使用Jsoup库解析HTML:
    ini 复制代码
    Document doc = Jsoup.parse(html);
    Elements links = doc.select("a[href]");
  4. 错误重试:

    php 复制代码
    int retry = 0;
    while (retry < 3) {
        try {
            // 请求代码...
            break; // 成功则跳出循环
        } catch (Exception e) {
            retry++;
            Thread.sleep(2000); // 等待后重试
        }
    }

完整项目建议添加:

  • 用户代理轮换
  • IP代理池
  • 分布式爬取
  • 数据存储模块

以上就是今天我要说简单的入门级爬虫教程,总体的思路是这样,具体操作还得根据项目网站实际情况来做具体的部署,如果大家有啥疑问可以留言讨论。

相关推荐
Q26433650238 小时前
【有源码】基于SpringBoot+Vue的博物馆展览与服务一体化平台-java博物馆数字化展品展示与交互平台设计
java·vue.js·spring boot·spring·毕业设计·javaweb·课程设计
guo_wen_qiang9 小时前
项目使用sentinel遇到的问题
java·sentinel
CarIise9 小时前
IDEA与Maven基础课堂笔记
java·intellij-idea·caffe
小溪学编程9 小时前
C语言篇:枚举类型
java·c语言·前端
云和数据.ChenGuang9 小时前
JAVAEE AI工程师路线图
java·人工智能·java-ee·fastapi·springai·langchain4j
2601_962885729 小时前
如何用 Python 统计 A 股连续涨停(几连板)?
java·linux·python
大圣编蚕9 小时前
Spring AOP 失效排查:从原理到实战的完整指南
java·后端·spring
EatFan9 小时前
MCP 从概念到落地:Java(Spring AI Alibaba)与 .NET 双栈接入实操对比
java·人工智能·后端·spring·.net·java后端·mcp
专业程序开发源9 小时前
springboot全民健身和饮食健康管理系统29158-计算机课程设计、毕业设计
java·spring boot·后端·python·django·php·课程设计
ym hyd 1119 小时前
汽车零部件缺陷管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·汽车·毕设