如何进行许多API调用并同时加载到postgres中?

时间:2019-02-07 03:30:49

标签: python-3.x async-await aiohttp

我有一个脚本,该脚本调用api(使用请求)以提取股票列表的财务数据。它将数据读取到pandas数据帧中,进行转换,然后使用psycopg2将提取的数据上传到postgres中。每个代码需要进行10-150个API调用。每次迭代都需要几秒钟。

鉴于代码行情清单的长度超过2k,因此该脚本需要大约一天的时间运行,而CPU仅以4%的容量使用。我想更改脚本,使其使用AIOHTTP(https://aiohttp.readthedocs.io/en/stable/client_quickstart.html ),以便在某个给定的时间制作每个股票行情所需的所有API。然后,随着每个请求的返回,可以将其转换并加载到Postgres中。我的希望是,通过增加CPU的工作量,可以大大减少处理每个股票的时间。

我看了有关aiohttp和async-await的文档,但是我很难理解如何构造异步循环。我也不确定如何确保在每个API请求返回时立即启动pandas / postgres上传,而不是等待所有API调用返回后再继续。

#here is a simplified example of the code for one ticker
import asyncio
import json
import pandas as pd
import psycopg2 as pg
import Requests as rq


tkr = foo
api_key = 'bar'
url = http://api_call_website.com?{0}&{1}&{2}&{3}&api-key:{4}
list_of_stmnts = 
[(True, 2009, 'Q4', 'pl'),
 (True, 2018, 'Q3', 'cf'),
 (True, 2018, 'Q2', 'cf'),
 (True, 2017, 'Q4', 'cf')]

#these "statements" contain the parameters that get passed into the url

async def async_get_loop(list_of_stmnts, tkr, url, api_key):
    urls = [url.format(tkr, stmt[1],stmt[2],stmt[3], api_key) for stmt in list_of_stmnts]
    #this builds the list of urls that need to be called
    await data = rq.request("GET", url)
    results = data.json()
    df = pd.DataFrame(results['values'])
    df.to_sql('table_name', engine, schema='schema', if_exists='append', index = False)
    #the postgres engine is defined earlier in the code using psycopg2
    return

这显示了我对异步等待如何工作的基本了解。我知道要使其异步,我需要实现aiohttp而不是Requests。但是坦率地说,我对如何使用这两个软件包一无所知。

0 个答案:

没有答案