首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务器上运行的Python脚本无法成功执行对NASDAQ端点的GET请求

服务器上运行的Python脚本无法成功执行对NASDAQ端点的GET请求
EN

Stack Overflow用户
提问于 2021-07-03 11:48:57
回答 1查看 54关注 0票数 0

我开发了一个脚本,需要从这个站点获取json数据:

https://api.nasdaq.com/api/screener/stocks?tableonly=true&offset=0&download=true

在我的机器上进行本地开发时,下面的代码可以工作:

代码语言:javascript
复制
# 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),但请求仍然挂起。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-07-05 05:06:20

事实证明,纳斯达克在它们的终端上有防刮擦措施。

我假设他们的API允许来自他们声明为个人的机器的请求,但不允许来自服务器的请求,因为他们的API从技术上讲是企业级的。

我的问题的解决方案是缓冲标头,以模拟来自有效API用户的调用:

代码语言:javascript
复制
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',
}

其成功地从端点返回所需的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68233074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档