使用 Jsoup 爬取網頁時,預設連線逾時極短(約 3 秒),對回應緩慢的網站易拋出 SocketTimeoutException。透過 timeout(毫秒) 方法即可調整。
// 設定 5 秒逾時(連線 + 讀取)
Document doc = Jsoup.connect("https://example.com").timeout(5000).get();
package jsoupTest;
import java.io.IOException;
import org.jsoup.*;
import org.jsoup.nodes.Document;
public class JsoupTest {
public static void main(String[] args) throws IOException {
String url = "https://www.jb51.net";
long start = System.currentTimeMillis();
Document doc = null;
try {
doc = Jsoup.connect(url).get(); // 無 timeout 設定
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("耗時:" + (System.currentTimeMillis() - start) + "ms");
}
if (doc != null) {
System.out.println("Title: " + doc.title());
}
}
}
可能輸出:
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
...
耗時:3885ms
Exception in thread "main" java.lang.NullPointerException
package jsoupTest;
import java.io.IOException;
import org.jsoup.*;
import org.jsoup.nodes.Document;
public class JsoupTest {
public static void main(String[] args) throws IOException {
String url = "https://www.jb51.net";
long start = System.currentTimeMillis();
Document doc = null;
try {
doc = Jsoup.connect(url).timeout(5000).get(); // 5 秒逾時
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("耗時:" + (System.currentTimeMillis() - start) + "ms");
}
if (doc != null) {
System.out.println("Title: " + doc.title());
}
}
}
Document doc = Jsoup.connect(url)
.timeout(10000) // 連線與讀取總逾時 10 秒
.userAgent("Mozilla/5.0") // 設定 User-Agent
.referrer("https://google.com")
.header("Accept", "text/html")
.cookie("session", "id")
.followRedirects(true)
.maxBodySize(0) // 0 表示不限制回應大小
.get();
| 異常 | 原因 | 對策 |
|---|---|---|
| SocketTimeoutException: Connect timed out | TCP 三向交握超時 | 增加 timeout、檢查防火牆/Proxy |
| SocketTimeoutException: Read timed out | 伺服器回應傳輸超時 | 增加 timeout、啟用 gzip 壓縮 |
| UnknownHostException | DNS 解析失敗 | 檢查網路/DNS、改用 IP 直連 |
| SSLHandshakeException | HTTPS 憑證驗證失敗 | 信任憑證或使用 .validateTLSCertificates(false) |
timeout(10000) 以上,視目標站點回應速度調整。.ignoreHttpErrors(true) 讓 4xx/5xx 狀態碼不拋出異常,由業務邏輯判斷。HttpClient 或 OkHttp 作為底層連線管理器,Jsoup 僅負責解析。