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

C# 遠端擷取網頁內容:WebClient 與 HttpClient 完整實作指南

     編輯:關於C語言

基礎實作:WebClient 同步下載

using System;
using System.Net;
using System.IO;
using System.Text;

namespace WebFetcher
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (var client = new WebClient())
                {
                    client.Credentials = CredentialCache.DefaultCredentials;
                    // 自動處理編碼偵測(需 .NET 4.5+)
                    // byte[] data = client.DownloadData("https://www.example.com");
                    // string html = Encoding.UTF8.GetString(data); // 或依據回應標頭決定編碼
                    
                    // 簡易版:指定編碼
                    byte[] data = client.DownloadData("https://www.163.com");
                    string html = Encoding.GetEncoding("GB2312").GetString(data); // 中文網站常用
                    // string html = Encoding.UTF8.GetString(data); // UTF-8 網站
                    
                    Console.WriteLine(html);
                    
                    // 儲存檔案
                    Directory.CreateDirectory(@"c:\test");
                    File.WriteAllText(@"c:\test\output.html", html, Encoding.UTF8);
                }
            }
            catch (WebException ex)
            {
                Console.WriteLine($"請求失敗: {ex.Message}");
            }
            Console.ReadLine();
        }
    }
}

進階建議:HttpClient 非同步模式 (現代標準)

WebClient 已被標記為過時,新專案應使用 HttpClient:

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class ModernFetcher
{
    private static readonly HttpClient _client = new HttpClient(); // 單例重用
    
    public async Task FetchAsync(string url)
    {
        try
        {
            var response = await _client.GetAsync(url);
            response.EnsureSuccessStatusCode();
            return await response.Content.ReadAsStringAsync(); // 自動處理編碼
        }
        catch (HttpRequestException ex)
        {
            Console.WriteLine($"請求異常: {ex.Message}");
            return null;
        }
    }
    
    // 使用範例
    public static async Task Demo()
    {
        var fetcher = new ModernFetcher();
        string html = await fetcher.FetchAsync("https://www.example.com");
        Console.WriteLine(html?.Substring(0, Math.Min(200, html.Length)));
    }
}

關鍵最佳實務

  • HttpClient 重用:全程式單例,避免 Socket 耗盡
  • 非同步/等待:不阻塞 UI 執行緒,提升回應性
  • 編碼自動偵測:ReadAsStringAsync 依據 Content-Type 標頭自動解碼
  • 逾時設定:_client.Timeout = TimeSpan.FromSeconds(30);
  • User-Agent 偽裝:_client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0...");
  • Cookie 管理:搭配 HttpClientHandler + CookieContainer
  • 錯誤處理:區分網路錯誤、HTTP 錯誤碼、逾時、取消權杖

法律與道德提醒

爬蟲請遵守 robots.txt、網站服務條款、速率限制,勿造成服務阻斷。商業用途需取得授權。

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