url类配合httpurlconnection是java原生最轻量、启动最快的网页抓取方式,无需第三方库,适用于简单爬取、监控和调试;需设置超时、请求头、检查响应码、正确处理编码与资源关闭。

用 URL 类配合 HttpURLConnection 抓取网页文本,是 Java 原生最轻量、启动最快的方式之一——不依赖第三方库,适合简单爬取、监控、调试等场景。
构造 URL 并打开连接
直接 new 一个 URL 对象,调用 openConnection() 获取 HttpURLConnection 实例。注意:这步不发起请求,只是准备连接。
- 设置超时时间(必设!否则默认无限等待):
conn.setConnectTimeout(5000)、conn.setReadTimeout(5000) - 设置请求方法为 GET:
conn.setRequestMethod("GET") - 可选加请求头模拟浏览器,避免被拒:
conn.setRequestProperty("User-Agent", "Mozilla/5.0")
发起请求并读取响应体
调用 conn.connect() 或直接 conn.getInputStream() 触发实际 HTTP 请求。推荐用后者,更简洁。
- 检查响应码:
int code = conn.getResponseCode(),200 表示成功;非 200 可用conn.getErrorStream()读错误内容 - 用
InputStreamReader包装输入流,并指定编码(优先用conn.getContentEncoding(),否则 fallback 到 UTF-8) - 用
BufferedReader高效读取整页文本,逐行或一次性readLine()拼接
正确关闭连接与资源释放
HttpURLConnection 不会自动复用或自动关闭底层 socket,必须显式处理。
- 务必在
finally块中调用is.close()和br.close() - 调用
conn.disconnect()显式断开(虽非强制,但可加速 socket 回收) - 若需复用连接,可启用 keep-alive(默认开启),但单次抓取无需额外配置
处理重定向与字符集自动识别
默认情况下 HttpURLConnection 会自动跟随 301/302 重定向(setInstanceFollowRedirects(true)),但不会自动解析 <meta charset> 或 HTTP Content-Type 中的字符集。
- 从响应头提取字符集:
String contentType = conn.getContentType(),用正则匹配charset=([^;]+) - 若未声明,再查 HTML body 中的
<meta http-equiv="Content-Type"> 或 <code><meta charset="...">(需先读前几 KB 字节) - 对纯文本或 JSON 接口,通常可安全用 UTF-8;对老旧站点,ISO-8859-1 是常见 fallback
不复杂但容易忽略。写个几十行工具方法,就能稳定抓取多数静态页面,比引入 OkHttp 或 Jsoup 更快冷启动。











