<%@ Page Language="C#" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.Text" %>
using System;
using System.Net;
using System.Text;
class Program
{
static void Main()
{
try
{
using (WebClient client = new WebClient())
{
client.Credentials = CredentialCache.DefaultCredentials;
byte[] data = client.DownloadData("https://blog.example.com");
string html = Encoding.UTF8.GetString(data);
Console.WriteLine(html);
}
}
catch (WebException ex)
{
Console.WriteLine($"抓取失敗: {ex.Message}");
}
}
}
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
// 靜態單例模式,避免 Socket 耗盡
private static readonly HttpClient _client = new HttpClient()
{
Timeout = TimeSpan.FromSeconds(30)
};
static async Task Main()
{
try
{
string url = "https://api.example.com/data";
// 自動處理壓縮、重定向、編碼檢測
string html = await _client.GetStringAsync(url);
Console.WriteLine(html);
}
catch (HttpRequestException ex)
{
Console.WriteLine($"網絡錯誤: {ex.Message}");
}
catch (TaskCanceledException)
{
Console.WriteLine("請求超時");
}
}
}
var handler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
CookieContainer = new CookieContainer(),
UseCookies = true
};
using (var client = new HttpClient(handler))
{
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (compatible; MyBot/1.0)");
client.DefaultRequestHeaders.Referrer = new Uri("https://www.google.com/");
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode(); // 拋異常如果非 2xx
// 手動處理編碼(GetStringAsync 已自動按 Content-Type charset 解碼)
string html = await response.Content.ReadAsStringAsync();
}
byte[] fileBytes = await _client.GetByteArrayAsync("https://example.com/image.png");
await File.WriteAllBytesAsync("image.png", fileBytes);
WebClient.DownloadData 返回原始字節,需手動指定編碼。HttpClient.GetStringAsync / ReadAsStringAsync 會自動讀取 Content-Type: text/html; charset=utf-8 中的 charset,若無則嘗試從 HTML `` 推斷(需 .NET 6+ 或第三方庫)。
若遇到無 charset 頁面,可用 Ude.NetStandard 或 EncodingDetector 庫檢測:
byte[] raw = await _client.GetByteArrayAsync(url);
string html = EncodingDetector.DetectAndDecode(raw); // 第三方庫
| 策略 | 代碼示例 |
|---|---|
| 隨機 User-Agent | 維護 UA 池,每次請求隨機選取 |
| 請求間隔 | await Task.Delay(Random.Next(1000, 3000)) |
| Cookie 持久化 | CookieContainer 跨請求共享 |
| 代理 IP | HttpClientHandler.Proxy = new WebProxy("ip:port") |
| 處理 JS 渲染 | 需引入 Selenium/Playwright/PuppeteerSharp |
robots.txt 與網站服務條款新項目請直接使用 HttpClient(單例模式)配合 async/await。WebClient 僅用於維護 .NET Framework 老舊代碼。抓取中文頁面時注意編碼自動檢測,複雜動態頁面需引入瀏覽器自動化工具。務必合法合規使用。