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

C# 實作網頁爬蟲:從單頁下載到多線程蜘蛛程式完整指南

     編輯:關於C語言

核心概念:將複雜問題簡化

開發網頁爬蟲的核心在於「分而治之」。面對整個網站的抓取需求,首先將問題最小化:如何下載單一網頁?在 C# 中,這可透過 HttpWebRequest 或 WebClient 類別輕鬆實現。基本流程為:建立請求、取得回應串流、判斷內容類型、讀取文字內容、最後寫入本地檔案。

單一網頁下載範例

string pageContent;
Uri url = new Uri("https://www.example.com");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();

if (response.ContentType.ToLower().StartsWith("text/"))
{
    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
    {
        pageContent = reader.ReadToEnd();
    }
}

using (StreamWriter writer = new StreamWriter(@"C:\page.html", false, Encoding.GetEncoding("gb2312")))
{
    writer.Write(pageContent);
}

擴展至全站爬取:連結提取策略

解決單頁下載後,下一步是獲取更多 URL。爬蟲的核心邏輯是:分析已下載頁面 → 提取所有連結 → 逐一下載 → 循環迭代。

早期網頁連結多集中在 href 屬性,但 Web 2.0 時代連結位置變得多樣化。經過分析發現,所有連結共同特徵是被雙引號 "" 包裹。可分為兩類處理:

  • 完整連結:如 "https://www.example.com",含 https:// 前綴,易於用 IndexOf 定位提取。
  • 相對連結:如 "/index.htm",需補全網域前綴。判斷難度較高,可採「試下載」策略:嘗試請求,超時則非有效連結。

效能優化:多線程架構

單線程爬蟲效率極低,解析與下載串行進行。引入多線程可大幅提升吞吐量:

  • 生產者-消費者模式:主線程負責解析連結並放入佇列,多個工作線程並行下載。
  • 需注意線程安全,使用 lock 或 ConcurrentQueue 管理共享資源。
  • 加入禮貌性延遲(Thread.Sleep)與請求標頭偽裝,避免被目標站點封禁。

進階考量

實際部署時還需處理:robots.txt 協議遵循、重試機制、斷點續傳、去重策略(Bloom Filter)、動態頁面渲染(Selenium/Playwright)等。現代專案建議直接使用成熟框架如 HtmlAgilityPack 解析 HTML、ScrapySharp 或 DotnetSpider 進行分佈式爬取。

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