Python中缓慢的API请求循环

2024-05-16 21:11:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从IEX的云服务器发出一些简单的API请求,以获取一些证券的收盘价。我成功地提取了数据,但这需要花费很长时间,而且数据量也不多。如果有人能帮助我重组代码,使其更快、更高效,那将是一个巨大的帮助。下面是我到目前为止所掌握的情况。。非常感谢各位

for i, row in Universe.iterrows():
    try:
        request = urllib.request.urlopen('https://cloud.iexapis.com/stable/stock/'+Universe['ticker'][i]+'/chart/date/'+Px_1+'?chartByDay=true&token=TOKEN').read()
        data = json.loads(request)
        Universe['Px_1'][i] = data[0]['close']
    except:
        Universe['Px_1'][i] = np.nan

Tags: 数据代码服务器apifordatarequest情况
1条回答
网友
1楼 · 发布于 2024-05-16 21:11:22

使用requests包创建一个可重用的持久连接,这将使每个请求更快:

import requests

session = requests.Session()

for i, row in Universe.iterrows():
    try:
        data = session.get(url).json()
        Universe['Px_1'][i] = data[0]['close']
    except:
        Universe['Px_1'][i] = np.nan

您还可以使用线程池并行运行请求:

from multiprocessing.dummy import Pool


def get_px1(ticker):
    url = 'https://cloud.iexapis.com/stable/stock/' + ticker + '/chart/date/' + Px_1 + '?chartByDay=true&token=TOKEN'
    try:
        data = session.get(url).json()
        return data[0]['close']
    except:
        return np.nan


Universe['Px_1'] = Pool(20).map(get_px1, Universe.ticker)

但是会话是否可以跨线程使用还不完全清楚,您可能需要使用一些特殊的东西,或者返回到requests.get。服务器可能对如此高的请求率不满意

还要注意except,因为它可能会悄悄地吞噬代码中的bug

相关问题 更多 >