開發網頁爬蟲的核心在於「分而治之」。面對整個網站的抓取需求,首先將問題最小化:如何下載單一網頁?在 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 進行分佈式爬取。