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

ASP.NET 抓取網頁內容的兩種核心實現:HttpWebRequest 與 WebResponse

     編輯:ASP.NET 基礎

前言

網頁內容抓取是爬蟲、API 整合、內容聚合等場景的基礎技能。ASP.NET 提供 HttpWebRequest/HttpWebResponse 與較高層級的 WebRequest/WebResponse 兩組 API。本文詳細解析兩種實作方式的完整程式碼與關鍵設定差異。

方法一:HttpWebRequest —— 精細控制、支援 BOM 自動識別編碼

此方式可詳細設定 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 等編碼,極大降低亂碼風險。

方法二:WebResponse —— 簡潔封裝、統一異常處理

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 Core / .NET 5+ 環境請改用 HttpClient

現代 .NET 專案強烈建議使用 HttpClient(配合 HttpClientFactory 管理生命週期),支援非同步、連線池、自動解壓縮、更優雅的 Header 操作:

private static readonly HttpClient _client = new HttpClient();
public static async Task GetHtmlAsync(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 以獲得更佳效能與維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved