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

使用HttpWebRequest/WebClient无法下载纳斯达克CSV文件,浏览器可正常下载

解决纳斯达克CSV文件无法通过HttpWebRequest/WebClient下载的问题

我之前也碰到过类似的反爬拦截问题,纳斯达克这个接口确实会验证请求的合法性,不是随便发个GET请求就能拿到数据的。核心原因是服务器会检查请求头中的关键字段,只有当请求看起来是来自真实浏览器时,才会返回CSV数据。

核心原因分析

浏览器发送请求时会附带完整的请求头(比如User-Agent、Accept、Accept-Language等),而HttpWebRequest和WebClient默认的请求头非常简略,会被服务器判定为非浏览器请求,直接拦截返回空结果。

解决方案:模拟浏览器请求头

最有效的办法就是在请求中添加和浏览器一致的请求头,推荐使用更现代的HttpClient(比旧的WebClient/HttpWebRequest更易用且功能更强)。下面是完整的C#代码示例:

using System;
using System.Net.Http;
using System.Threading.Tasks;

class NasdaqCsvDownloader
{
    static async Task Main(string[] args)
    {
        var targetUrl = "http://www.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=AMEX&render=download";
        
        using (var httpClient = new HttpClient())
        {
            // 完全模拟Chrome浏览器的请求头,你也可以换成Firefox等其他浏览器的头
            httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36");
            httpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8");
            httpClient.DefaultRequestHeaders.Add("Accept-Language", "en-US,en;q=0.5");
            httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
            httpClient.DefaultRequestHeaders.Add("Connection", "keep-alive");
            httpClient.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
            
            // 允许自动重定向(纳斯达克可能会把HTTP请求跳转到HTTPS)
            httpClient.AllowAutoRedirect = true;
            
            try
            {
                var response = await httpClient.GetAsync(targetUrl);
                response.EnsureSuccessStatusCode(); // 确保请求返回成功状态码
                
                // 读取CSV内容,或者直接保存到文件
                var csvData = await response.Content.ReadAsStringAsync();
                // await System.IO.File.WriteAllTextAsync("AMEX_Companies.csv", csvData);
                
                Console.WriteLine("CSV数据获取成功!");
                // 打印前500个字符验证结果
                Console.WriteLine("\n预览:\n" + csvData.Substring(0, Math.Min(500, csvData.Length)));
            }
            catch (Exception ex)
            {
                Console.WriteLine($"下载失败:{ex.Message}");
            }
        }
    }
}

额外注意事项

  • 如果坚持使用旧的WebClient,也可以手动添加请求头:webClient.Headers.Add("User-Agent", "浏览器UA字符串"),但HttpClient是更推荐的选择
  • 可以用Fiddler抓取浏览器的完整请求头,完全复制到代码中(包括Cookie,如果浏览器请求中带有Cookie的话)
  • 不要频繁发送请求,避免触发纳斯达克的反爬机制导致IP被封禁
  • 检查你的网络环境,确保程序没有被防火墙、代理服务器拦截

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:02:23