上一篇
httpclient爬网站实例
- 行业动态
- 2025-04-29
- 2824
使用Apache HttpClient爬取网页需创建CloseableHttpClient实例,配置HttpGet请求对象,执行execute方法获取响应,通过EntityUtils处理响应内容,注意捕获IOException并
环境准备
使用 HttpClient
进行网站爬取前,需确保引入相关依赖,以下以 Java 11+ 内置的 HttpClient
为例,无需额外添加第三方库。
发送 GET 请求
通过 HttpClient
发送 HTTP GET 请求,获取目标网页的 HTML 内容。
步骤 | 代码示例 | 说明 |
---|---|---|
创建 HttpClient | HttpClient client = HttpClient.newHttpClient(); | 初始化客户端,支持异步请求 |
构建 HttpRequest | java<br>HttpRequest request = HttpRequest.newBuilder()<br> · .uri(URI.create("https://example.com"))<br> · .GET()<br> · .build(); | 设置目标 URL 和请求方法(GET) |
发送请求并获取响应 | java<br>HttpResponse<String> response =<br> client.send(request, BodyHandlers.ofString()); | 同步发送请求,以字符串形式接收响应体 |
处理响应数据
从响应中提取状态码、头信息和正文内容。
响应属性 | 代码示例 | 说明 |
---|---|---|
状态码 | int statusCode = response.statusCode(); | 检查是否成功(如 200) |
响应头 | Map<String, List<String>> headers = response.headers().map(); | 获取 Content-Type 等头信息 |
响应体(HTML) | String body = response.body(); | 网页源代码,可用于后续解析 |
异常处理
处理网络超时、连接失败等异常情况。
异常类型 | 处理方式 | 说明 |
---|---|---|
IOException | java<br>try {<br> // 发送请求<br>} catch (IOException e) {<br> e.printStackTrace();<br>} | 捕获网络相关的 I/O 异常 |
InterruptedException | java<br>try {<br> // 异步请求处理<br>} catch (InterruptedException e) {<br> Thread.currentThread().interrupt();<br>} | 处理线程中断(异步请求时) |
完整示例代码
import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.io.IOException; import java.util.Map; public class HttpClientExample { public static void main(String[] args) { // 初始化 HttpClient HttpClient client = HttpClient.newHttpClient(); // 构建请求 HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://example.com")) .GET() .build(); try { // 发送请求并获取响应 HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); // 处理响应 System.out.println("状态码: " + response.statusCode()); System.out.println("响应头: " + response.headers().map()); System.out.println("响应体: " + response.body()); } catch (IOException | InterruptedException e) { // 异常处理 e.printStackTrace(); } } }
相关问题与解答
问题 1:如何模拟浏览器发送请求(设置 User-Agent)?
解答:
在构建 HttpRequest
时,通过 .header()
方法添加 User-Agent
头,
HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://example.com")) .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)") .GET() .build();
说明:部分网站会检测 User-Agent
,模拟浏览器可绕过简单反爬虫机制。
问题 2:如何爬取需要携带 Cookie 的页面?
解答:
通过 HttpRequest.newBuilder().cookie(...)
或使用 HttpClient
的 CookieManager
管理 Cookie。
// 添加 Cookie HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://example.com")) .cookie("session_id", "abc123") .GET() .build();
说明:若需自动处理 Cookie(如登录后爬取),需结合 CookieManager