使用C#下载网页时遭遇403 Forbidden错误求助
解决C# WebClient下载SEC文件时的403 Forbidden错误
出现403 Forbidden是因为SEC的EDGAR服务器会校验请求的User-Agent请求头,默认情况下WebClient发送的请求没有携带符合要求的User-Agent,被服务器判定为非合法请求而拦截。
SEC要求User-Agent需要包含你的联系信息(比如邮箱),这样服务器能在必要时联系你,避免被识别为恶意爬虫。
修改后的代码
using (System.Net.WebClient wc = new System.Net.WebClient()) { // 设置符合SEC要求的User-Agent,替换成你的邮箱或联系信息 wc.Headers.Add("User-Agent", "Your Name <your-email@example.com>"); try { wc.DownloadFile(webURL, filePath); } catch (System.Exception ex) { // 处理异常,比如打印错误信息 Console.WriteLine($"下载失败:{ex.Message}"); } }
额外注意事项
- 不要高频次批量请求SEC服务器,遵守EDGAR的使用规则,避免被临时封禁IP
- 如果你的项目是.NET Core或.NET 5+,更推荐使用
HttpClient(单例模式)来处理请求,性能和稳定性更好,示例代码如下:
using System.Net.Http; using System.Threading.Tasks; using System.IO; public async Task DownloadSecFileAsync(string webURL, string filePath) { // 建议将HttpClient作为单例,不要每次请求都创建 using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Your Name <your-email@example.com>"); try { var response = await httpClient.GetAsync(webURL); response.EnsureSuccessStatusCode(); // 抛出HTTP错误状态码的异常 await using var stream = await response.Content.ReadAsStreamAsync(); await using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write); await stream.CopyToAsync(fileStream); } catch (HttpRequestException ex) { Console.WriteLine($"请求失败:{ex.Message}"); } }
内容的提问来源于stack exchange,提问作者DRG
相关产品推荐
相关产品推荐

