2013-07-23 172 views
4

我很努力地使用Python和请求来访问流API。了解Python HTTP流式传输

API说:“我们已经启用了一个流式端点来利用持久HTTP套接字连接请求报价和交易数据。来自API的流数据包括做一个Authenticated HTTP请求并让HTTP套接字打开不断接收数据。“

如何我一直在试图访问数据:

s = requests.Session() 
def streaming(symbols): 
    url = 'https://stream.tradeking.com/v1/market/quotes.json' 
    payload = {'symbols': ','.join(symbols)} 
    return s.get(url, params=payload, stream=True) 
r = streaming(['AAPL', 'GOOG']) 

的请求文档here显示的利息两件事情:使用使用的发电机/迭代器与分块数据,在数据字段中传递。对于流数据,它建议使用如下代码:

for line in r.iter_lines(): 
    print(line) 

既不似乎工作,虽然我不知道把发电机的功能是什么,因为例子是不清楚。使用r.iter_lines(),我得到的输出:“b”{“status”:“connected”} {“status”:disconnected“}'”

我可以访问标题,响应是HTTP 200 ,但无法获得有效的数据,或找到有关如何在python中访问流HTTP数据的明确示例。在Python中执行此操作。

标题:{'connection':'keep-alive','content-type':'application/json','x-powered-by':'Express','transfer-encoding ':'chunked'}

+1

把你的网址放到我的浏览器中会返回一个“无效的授权标题”消息,你需要进行身份验证吗?和/或,你是否正确读取JSON结果? – verbsintransit

+1

@verbsintransit如果OP看到'200 OK'则显然他已经认证完成 – woozyking

+0

API确实需要授权,为了简单起见,我忽略了授权行,我会发布密钥,但是它们与我的交易账户相关联,对于非流式请求,我使用Request .json()。我可能也需要在这里做 - 不知道。 –

回答

2

不知道你是否知道这一点,但TradeKing不会在他们的JSON blob之间放置换行符。因此,您必须使用iter_content逐字节地获取它,将该字节附加到缓冲区,尝试解码缓冲区,成功清除缓冲区并产生结果对象。 :(

+0

很高兴为您效力!我所做的就是使用NodeJS来监听流,并通过ZeroMQ接口将对象释放给python监听器,然后他们会对它执行魔术。处理大量符号时,Python会变得迟缓。 – krillr

9

正如verbsintransit所述,您需要解决您的身份验证问题,然而您的流问题可以修复通过使用本例ED:

s = requests.Session() 

def streaming(symbols): 
    payload = {'symbols': ','.join(symbols)} 
    headers = {'connection': 'keep-alive', 'content-type': 'application/json', 'x-powered-by': 'Express', 'transfer-encoding': 'chunked'} 
    req = requests.Request("GET",'https://stream.tradeking.com/v1/market/quotes.json', 
          headers=headers, 
          params=payload).prepare() 

    resp = s.send(req, stream=True) 

    for line in resp.iter_lines(): 
     if line: 
      yield line 


def read_stream(): 

    for line in streaming(['AAPL', 'GOOG']): 
     print line 


read_stream() 

if line:条件检查所述line是一个实际的消息或者只是保持活动的连接。

+1

非常感谢!我想我可能会等待股票市场全面测试的时候。我将在此期间学习/尝试理解它,并将发布tmw所发生的事情。 –

+1

这个例子的关键是'send()'中的'stream = True'。如果您没有设置,请求会尝试下载整个机构。文档确实显示了正在使用的关键字。 – Lukasa

+0

我得到的错误如下:ConnectionError:('连接中止。',RemoteDisconnected('远端没有响应的关闭连接')) –