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();
}
}
}
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)));
}
}
ReadAsStringAsync 依據 Content-Type 標頭自動解碼_client.Timeout = TimeSpan.FromSeconds(30);_client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0...");HttpClientHandler + CookieContainer爬蟲請遵守 robots.txt、網站服務條款、速率限制,勿造成服務阻斷。商業用途需取得授權。