2013-07-23 336 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('遠端沒有響應的關閉連接')) –