使用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
相关产品推荐
相关产品推荐

