我目前正在开发一个项目,要求我在线从REST API中提取数据,然后将其转储到本地数据库中进行进一步处理。
API连接到在线发票平台,我有点担心脚本的速度。
目前我的脚本会打开一个连接,建立一个发票列表。对于每个发票,脚本然后打开该特定发票行的连接,该连接将被转储到另一个列表中。
我目前正在阅读一个包含9张发票和共15张发票的帐户。这需要我花费7.4秒来检索。
任何人都可以帮我处理我的代码吗?也许我可以加快一点。
# -*- coding: utf-8 -*-
import requests
from datetime import datetime
token = "b877aff346ec0c7d238c21a6c33929c84b13a110"
def request(accessToken, url):
link = 'https://api.billysbilling.com/v2/' +str(url)
headers= {'X-Access-Token': accessToken}
data = requests.get(link, headers=headers).json()
return data
def invoiceLines(token):
inv = request(accessToken = token, url = "invoices")["invoices"]
idList = []
invoiceLinesList = []
lines = []
for r in inv:
if not r["id"] in idList:
idList.append(r["id"])
invoiceLinesList.append(request(accessToken = token,
url = str("invoiceLines?invoiceId=") +
str(r["id"]))["invoiceLines"])
for invoice in invoiceLinesList:
for line in invoice:
lines.append(line)
return [inv, lines]
start = datetime.now()
data = invoiceLines(token)
print "Time spent - " + str(datetime.now()-start)
print "Invoices - " + str(len(data[0]))
print "Invoice lines - " +str(len(data[1]))
由于 亨利克
答案 0 :(得分:1)
使用请求session,它会自动为多个请求重复使用一个连接。例如:
class BillingAPI(object):
def __init__(self, token, root_url='https://api.billysbilling.com/v2/'):
self._session = requests.Session()
self._session.headers['X-Access-Token'] = token
self.root_url = root_url
def get(self, url_part):
url = self.root_url + str(url_part)
return self._session.get(url).json()
def invoiceLines(token):
api = BillingAPI(token)
inv = api.get('invoices')['invoices']
# ...
您还可以尝试并行请求不同发票的发票行。 requests-futures扩展名可以提供帮助。但请注意以免服务器过载。
除此之外,您可能会受到您正在使用的API的服务器性能的限制。
考虑是否可以采用一般优化,例如缓存。 CacheControl库为请求提供了一个简单的HTTP缓存,但此API不太可能支持HTTP缓存,因此您需要自己推送。