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

C# 網頁爬蟲實戰:抓取 HTML、解析標題/描述/圖片、移除標籤

     編輯:關於C語言

從網頁擷取結構化資料是常見需求。本文示範使用 WebClient 下載頁面、正則表達式 解析 Meta 標籤與圖片連結、以及移除 HTML 標籤取純文字的完整流程。

1. 下載網頁原始碼


public static string DownloadPage(string url)
{
    if (string.IsNullOrWhiteSpace(url)) return null;
    
    using (var wc = new WebClient())
    {
        wc.Encoding = Encoding.UTF8; // 關鍵:指定編碼避免亂碼
        wc.Headers["User-Agent"] = "Mozilla/5.0 (compatible; C# Crawler)";
        try 
        {
            return wc.DownloadString(url);
        }
        catch (WebException ex)
        {
            // 記錄錯誤
            return null;
        }
    }
}

注意: .NET Core / 5+ 建議改用 HttpClient,WebClient 已標記過時。

2. 解析常見 Meta 資訊

頁面標題 <title>


public static string ExtractTitle(string html)
{
    var match = Regex.Match(html, @"]*>(.*?)", 
        RegexOptions.IgnoreCase | RegexOptions.Singleline);
    return match.Success ? HttpUtility.HtmlDecode(match.Groups[1].Value.Trim()) : null;
}

描述 <meta name="description">


public static string ExtractDescription(string html)
{
    // 支援 name="description" 或 property="og:description"
    var pattern = @"]+)";
    var match = Regex.Match(html, pattern, RegexOptions.IgnoreCase);
    return match.Success ? HttpUtility.HtmlDecode(match.Groups[1].Value.Trim()) : null;
}

3. 擷取所有圖片連結


public static List ExtractImageUrls(string html, string baseUrl = null)
{
    var urls = new List();
    // 匹配 ,支援單雙引號、屬性順序不固定
    var regex = new Regex(@"]*\bsrc\s*=\s*[""']?([^""'>\s]+)", RegexOptions.IgnoreCase);
    
    foreach (Match m in regex.Matches(html))
    {
        string src = m.Groups[1].Value;
        // 處理相對路徑
        if (!string.IsNullOrEmpty(baseUrl) && !Uri.IsWellFormedUriString(src, UriKind.Absolute))
        {
            src = new Uri(new Uri(baseUrl), src).AbsoluteUri;
        }
        urls.Add(src);
    }
    return urls.Distinct().ToList();
}

4. 移除 HTML 標籤取純文字


public static string StripHtml(string html)
{
    if (string.IsNullOrEmpty(html)) return string.Empty;
    
    // 1. 移除 Script/Style 區塊
    html = Regex.Replace(html, @"<(script|style)\b[^>]*>.*?", "", 
        RegexOptions.IgnoreCase | RegexOptions.Singleline);
    
    // 2. 移除所有標籤
    html = Regex.Replace(html, @"<[^>]+>", " ");
    
    // 3. 解碼 HTML 實體 (  < & 等)
    html = HttpUtility.HtmlDecode(html);
    
    // 4. 合併多餘空白
    html = Regex.Replace(html, @"\s+", " ").Trim();
    
    return html;
}

5. 整合範例:建立簡易爬蟲類


public class SimpleCrawler
{
    public PageInfo Crawl(string url)
    {
        string html = DownloadPage(url);
        if (html == null) return null;
        
        return new PageInfo
        {
            Url = url,
            Title = ExtractTitle(html),
            Description = ExtractDescription(html),
            ImageUrls = ExtractImageUrls(html, url),
            TextContent = StripHtml(html)
        };
    }
}

public class PageInfo
{
    public string Url { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public List ImageUrls { get; set; }
    public string TextContent { get; set; }
}

進階建議與注意事項

  • 健壯性:真實網頁 HTML 往往不標準,正則難以完美覆蓋。生產環境建議使用 HtmlAgilityPack 或 AngleSharp 等 HTML 解析器,支援 XPath/CSS Selector。
  • 編碼偵測:回應標頭無 charset 時,需從 `` 或內容偵測 (如 Ude.NetStandard)。
  • 反爬蟲:加入 User-Agent、Referer、Cookie 容器、請求間隔隨機化。
  • JavaScript 渲染:若內容由 JS 動態產生,需用 Selenium、PuppeteerSharp 或 Playwright 驅動真實瀏覽器。
  • 法律合規:遵守 robots.txt、網站服務條款、資料隱私法規 (GDPR、個資法)。

總結

本文提供零相依、純 .NET Framework/Core 可用的基礎爬蟲工具組。理解正則解析邏輯有助於除錯,但複雜專案請改用成熟的 HTML 解析庫。

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