網頁內容抓取是爬蟲、API 整合、內容聚合等場景的基礎技能。ASP.NET 提供 HttpWebRequest/HttpWebResponse 與較高層級的 WebRequest/WebResponse 兩組 API。本文詳細解析兩種實作方式的完整程式碼與關鍵設定差異。
此方式可詳細設定 Header、Cookie、User-Agent、重導向策略等,適合需模擬瀏覽器行為的場景。特別優勢在於使用 Encoding.Default 讀取資料流,能自動處理帶 BOM(Byte Order Mark)的網頁,無需手動偵測編碼。
////// 方法一:推薦用於需精細控制請求的場景 /// 對帶 BOM 的網頁極有效,無論何種編碼都能正確識別 /// public static string GetHtmlSource2(string url) { string html = ""; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Accept = "*/*"; request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)"; request.AllowAutoRedirect = true; request.Referer = url; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream stream = response.GetResponseStream(); // 關鍵:使用 Encoding.Default 自動處理 BOM StreamReader reader = new StreamReader(stream, Encoding.Default); html = reader.ReadToEnd(); stream.Close(); return html; }
關鍵設定解析:
UserAgent:模擬瀏覽器,避免被反爬蟲攔截。AllowAutoRedirect = true:自動處理 301/302 重導向。Encoding.Default:.NET 會根據資料流開頭的 BOM 自動選擇 UTF-8、UTF-16 等編碼,極大降低亂碼風險。WebRequest/WebResponse 為抽象基類,程式碼較精簡,適合快速開發。範例採用 try-catch-finally 確保資源釋放,並指定 UTF-8 編碼讀取:
public static string GetHttpData2(string Url)
{
string sException = null, sRslt = null;
WebResponse oWebRps = null;
WebRequest oWebRqst = WebRequest.Create(Url);
oWebRqst.Timeout = 50000; // 50 秒逾時
try
{
oWebRps = oWebRqst.GetResponse();
}
catch (WebException e) { sException = e.Message; }
catch (Exception e) { sException = e.ToString(); }
finally
{
if (oWebRps != null)
{
// 指定 UTF-8,若網頁非 UTF-8 可能亂碼
StreamReader oStreamRd = new StreamReader(oWebRps.GetResponseStream(), Encoding.GetEncoding("utf-8"));
sRslt = oStreamRd.ReadToEnd();
oStreamRd.Close();
oWebRps.Close();
}
}
return sRslt;
}
差異提醒: 此法預設不自動處理 BOM,若目標網頁編碼不固定,建議改用方法一或引入 charset 偵測邏輯(如檢查 Content-Type Header 或 HTML meta 標籤)。
現代 .NET 專案強烈建議使用 HttpClient(配合 HttpClientFactory 管理生命週期),支援非同步、連線池、自動解壓縮、更優雅的 Header 操作:
private static readonly HttpClient _client = new HttpClient(); public static async TaskGetHtmlAsync(string url) { _client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 ..."); var response = await _client.GetAsync(url); response.EnsureSuccessStatusCode(); // HttpClient 會自動根據 Content-Type 與 BOM 解碼 return await response.Content.ReadAsStringAsync(); }
HttpWebRequest 適合需精細控制請求細節、自動處理編碼的傳統專案;WebResponse 適合簡單快速抓取且編碼已知的場景。新專案請優先採用 HttpClient 以獲得更佳效能與維護性。