我开发了一个脚本,需要从这个站点获取json数据:
https://api.nasdaq.com/api/screener/stocks?tableonly=true&offset=0&download=true
在我的机器上进行本地开发时,下面的代码可以工作:
# gets all symbols from NYSE, NASDAQ, AMEX
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
}
res = requests.get("https://api.nasdaq.com/api/screener/stocks?tableonly=true&offset=0&download=true",
headers=headers)然而,当我将这段代码移到运行Ubuntu20.04的公共服务器上时,请求停止工作,并开始无限期地挂起。该请求甚至不会返回响应。
我尝试使用Chrome developer tools复制我的浏览器在访问此接口时发出的cURL请求,并在服务器上运行纯curl命令,当执行此操作时,请求成功并返回正确的数据。但是,一旦我分解了cURL命令并将其放入Python (和PHP)代码中,它就不能工作了,并且会无限地挂起。
我正在处理的服务器上没有定义出站网络规则,也没有任何防火墙或IDS处于活动状态。也没有关于API上的IP限制或类似内容的文档。
更新:我甚至在一个EC2实例上尝试了相同的脚本,在Chrome上安装了Windows10的完整副本(基本上是模仿我本地的PC),但请求仍然挂起。
有什么想法吗?
发布于 2021-07-05 05:06:20
事实证明,纳斯达克在它们的终端上有防刮擦措施。
我假设他们的API允许来自他们声明为个人的机器的请求,但不允许来自服务器的请求,因为他们的API从技术上讲是企业级的。
我的问题的解决方案是缓冲标头,以模拟来自有效API用户的调用:
headers = {
'authority': 'api.nasdaq.com',
'accept': 'application/json, text/plain, */*',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
'origin': 'https://www.nasdaq.com',
'sec-fetch-site': 'same-site',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://www.nasdaq.com/',
'accept-language': 'en-US,en;q=0.9',
}其成功地从端点返回所需的信息。
https://stackoverflow.com/questions/68233074
复制相似问题