package ch14;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.zip.GZIPInputStream;
public class Test4 {
public static void main(String[] args) throws Exception {
URL url = new URI("https://ithelp.ithome.com.tw/articles/10374533").toURL();
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setInstanceFollowRedirects(true);
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
// 關鍵:偽裝成瀏覽器,並要到 gzip
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
+ "(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");
conn.setRequestProperty("Accept-Encoding", "gzip");
int status = conn.getResponseCode();
InputStream raw = (status >= 200 && status < 400) ? conn.getInputStream()
: (conn.getErrorStream() != null ? conn.getErrorStream() : conn.getInputStream());
// 若有壓縮就解壓
String contentEncoding = conn.getHeaderField("Content-Encoding");
if (contentEncoding != null && contentEncoding.toLowerCase(Locale.ROOT).contains("gzip")) {
raw = new GZIPInputStream(raw);
}
// 依 Content-Type 解析 charset,沒有就用 UTF-8
String contentType = conn.getContentType(); // 例:text/html; charset=UTF-8
Charset cs = parseCharset(contentType, StandardCharsets.UTF_8);
try (BufferedReader br = new BufferedReader(new InputStreamReader(raw, cs))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} finally {
conn.disconnect();
}
}
private static Charset parseCharset(String contentType, Charset fallback) {
if (contentType != null) {
for (String part : contentType.split(";")) {
String s = part.trim().toLowerCase(Locale.ROOT);
if (s.startsWith("charset=")) {
String name = part.substring(part.indexOf('=') + 1).trim().replace("\"", "");
try {
return Charset.forName(name);
} catch (Exception ignore) {
}
}
}
}
return fallback;
}
}
參考資料
https://www.tutorialspoint.com/java/httpurlconnection_setinstancefollowredirects.htm