You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用WebClient无法下载NSE文件但手动可下载的技术问题求助

解决WebClient下载NSE印度文件失败的问题

我之前碰到过类似的情况,NSE India的服务器对请求的校验挺严格的,光设置UserAgent根本不够,你代码里的Accept头设成"/"明显不对,而且还缺了几个关键的请求头,甚至可能需要先获取网站的会话Cookie才能正常下载。

修正后的代码示例

private void download_nse() 
{
    string source_location = "https://www.nseindia.com/content/historical/DERIVATIVES/2015/DEC/fo23DEC2015bhav.csv.zip";
    Uri uu = new Uri(source_location);
    
    using (WebClient fileReader = new WebClient()) 
    {
        try 
        {
            // 模拟真实浏览器的请求头
            fileReader.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");
            fileReader.Headers.Add(HttpRequestHeader.Accept, "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
            fileReader.Headers.Add(HttpRequestHeader.Referer, "https://www.nseindia.com/");
            fileReader.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
            fileReader.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.5");
            
            // 先请求主页获取会话Cookie(部分网站会验证会话合法性)
            fileReader.DownloadString("https://www.nseindia.com/");
            
            // 执行文件下载
            fileReader.DownloadFile(uu, @"d:\nse\fo23DEC2015bhav.csv.zip");
            Console.WriteLine("下载完成!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"下载出错:{ex.Message}");
        }
    }
}

关键修正点说明

  • 修复Accept头:你之前设置的"/"不符合浏览器的标准请求格式,换成真实浏览器发送的Accept值,让服务器判定这是合法的浏览器请求。
  • 添加Referer头:NSE的服务器会检查请求的来源页面,把Referer设为官网主页可以通过校验。
  • 先获取Cookie:很多网站会在首次访问时生成会话Cookie,后续请求必须携带这个Cookie才能正常获取资源,所以先请求一次主页建立会话很有必要。
  • 补充其他请求头:比如AcceptEncoding和AcceptLanguage,模拟更真实的浏览器请求行为,降低被反爬机制拦截的概率。

如果还是不行,推荐用HttpClient代替WebClient,它的灵活性更高,能更好地处理复杂的请求场景,比如持久化Cookie容器:

private async Task download_nse_with_httpclient()
{
    string source_location = "https://www.nseindia.com/content/historical/DERIVATIVES/2015/DEC/fo23DEC2015bhav.csv.zip";
    var cookieContainer = new CookieContainer();
    
    using (var handler = new HttpClientHandler { CookieContainer = cookieContainer })
    using (var client = new HttpClient(handler))
    {
        client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");
        client.DefaultRequestHeaders.Accept.ParseAdd("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        client.DefaultRequestHeaders.Referrer = new Uri("https://www.nseindia.com/");
        client.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate, br");
        client.DefaultRequestHeaders.AcceptLanguage.ParseAdd("en-US,en;q=0.5");
        
        // 先请求主页建立会话
        await client.GetAsync("https://www.nseindia.com/");
        
        // 下载目标文件
        var response = await client.GetAsync(source_location);
        response.EnsureSuccessStatusCode();
        
        using (var fs = new FileStream(@"d:\nse\fo23DEC2015bhav.csv.zip", FileMode.Create))
        {
            await response.Content.CopyToAsync(fs);
        }
        
        Console.WriteLine("下载完成!");
    }
}

额外注意事项

  • 确保你的程序有权限写入d:\nse\目录,权限不足也会导致下载失败。
  • 如果以上方法失效,可以用浏览器开发者工具(F12)查看手动下载时浏览器发送的所有请求头,然后在代码中完全模拟这些头信息。

内容的提问来源于stack exchange,提问作者Prasanna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:40:54