无法使用Python和Golang下载NSE Archives数据
解决NSE受限脚本CSV数据请求失败问题
问题分析
NSE(印度国家证券交易所)的归档服务器带有反爬机制,会验证请求合法性:
- 未携带
User-Agent头的请求会被服务器拦截或重定向,导致Python请求陷入循环 - Golang默认启用HTTP/2,而该服务器对HTTP/2请求存在兼容性问题,触发
http2StreamError
修正后的代码
Python 版本
添加模拟浏览器的User-Agent头,避免被服务器识别为脚本请求:
import requests url = "https://nsearchives.nseindia.com/content/fo/fo_secban.csv" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } try: response = requests.get(url, headers=headers, allow_redirects=True) response.raise_for_status() except requests.exceptions.RequestException as e: print(f"请求错误: {e}") else: print(response.text)
Golang 版本
除了添加User-Agent头,还需要强制使用HTTP/1.1协议,规避HTTP/2的兼容性问题:
package main import ( "crypto/tls" "fmt" "io/ioutil" "net/http" ) func main() { url := "https://nsearchives.nseindia.com/content/fo/fo_secban.csv" // 创建自定义客户端,强制使用HTTP/1.1 client := &http.Client{ Transport: &http.Transport{ TLSNextProto: make(map[string]func(authority string, c *tls.Conn) http.RoundTripper), }, } // 构造请求并添加浏览器UA头 req, err := http.NewRequest("GET", url, nil) if err != nil { fmt.Printf("创建请求失败: %s\n", err) return } req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") response, err := client.Do(req) if err != nil { fmt.Printf("GET请求失败: %s\n", err) return } defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { fmt.Printf("读取响应体失败: %s\n", err) return } fmt.Println(string(body)) }
关键修改说明
- User-Agent头:模拟浏览器的请求标识,让服务器认为请求来自合法客户端
- Golang强制HTTP/1.1:通过
TLSNextProto禁用HTTP/2,避免服务器的HTTP/2流错误 - Python允许重定向:默认
allow_redirects=True,确保跟随服务器的合法重定向(如果有)
内容的提问来源于stack exchange,提问作者VIEVK KUMAR
相关产品推荐
相关产品推荐

