首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 抓取網頁數據入門:HttpURLConnection 實戰範例

     編輯:Java 程式設計入門

快速上手:幾行代碼抓取百度首頁

Java 標準庫 java.net 提供了 HttpURLConnection,無需第三方依賴即可完成 HTTP 請求。下面以抓取百度首頁為例,演示核心流程:建立連接 → 設置超時 → 讀取輸入流 → 寫入字節數組。

核心代碼

URL url = new URL("https://www.baidu.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);      // 連接超時 5 秒
conn.setReadTimeout(30000);        // 讀取超時 30 秒

try (DataInputStream in = new DataInputStream(conn.getInputStream())) {
    byte[] buffer = new byte[8192];
    int len;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    while ((len = in.read(buffer)) != -1) {
        baos.write(buffer, 0, len);
    }
    byte[] content = baos.toByteArray();  // 現在 content 擁有完整頁面數據
    // 後續可寫入文件、解析 HTML、轉字符串等
    System.out.println("下載完成,大小:" + content.length + " 字節");
}

關鍵點解析

  • 超時設置:生產環境務必同時設置連接與讀取超時,防止線程無限阻塞。
  • 流處理:示例使用 ByteArrayOutputStream 累積字節,避免預先分配巨大數組;若文件極大,建議直接寫入 FileOutputStream 落地。
  • 編碼處理:頁面編碼可從 Content-Type 頭獲取,或用 new String(content, "UTF-8") 轉字符串。
  • 異常處理:網絡操作需捕獲 IOException、SocketTimeoutException 等。

進階建議

  • 需支援 HTTPS、重定向、Cookie、連接池時,建議改用 Apache HttpClient 或 OkHttp。
  • 大規模爬蟲請遵守 robots.txt 並控制並發頻率。

完整可運行類

import java.io.*;
import java.net.*;

public class SimpleWebFetcher {
    public static void main(String[] args) {
        String target = "https://www.baidu.com";
        try {
            URL url = new URL(target);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(30000);
            conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Java Fetcher)");

            try (InputStream in = conn.getInputStream();
                 ByteArrayOutputStream out = new ByteArrayOutputStream()) {
                byte[] buf = new byte[8192];
                int n;
                while ((n = in.read(buf)) != -1) out.write(buf, 0, n);
                byte[] data = out.toByteArray();
                System.out.printf("抓取 %s 完成,狀態碼 %d,大小 %d bytes%n",
                        target, conn.getResponseCode(), data.length);
                // Files.write(Paths.get("baidu.html"), data); // 如需存檔
            }
        } catch (IOException e) {
            System.err.println("抓取失敗:" + e.getMessage());
        }
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved