2013-07-23 2 views
4

파이썬 및 요청을 사용하여 스트리밍 API에 액세스하는 데 어려움을 겪고 있습니다.파이썬 HTTP 스트리밍에 대한 이해

API가 말한 내용 : "지속적인 HTTP 소켓 연결을 사용하여 견적과 거래 데이터 모두를 요청할 수 있도록 스트리밍 엔드 포인트를 사용할 수있었습니다 .API의 스트리밍 데이터는 인증 된 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입니다. , 유효한 데이터를 얻을 수 없거나 파이썬에서 스트리밍 HTTP 데이터에 액세스하는 방법에 대한 명확한 예제를 찾을 수 없다면 도움이 될 것입니다. API는 스트림을 열어두기 위해 Jetty for Java를 사용하도록 권장하지만 어떻게해야할지 모르겠습니다.

헤더 : { '연결': 'keep-alive', 'content-type': 'application/json', 'x-powered-by': 'Express', 'transfer-encoding ':'chunked '}

+1

브라우저에 URL을 넣으면 "잘못된 인증 헤더"메시지가 반환됩니다. 인증을 받아야합니까? 그리고/또는 JSON 결과를 제대로 읽고 있습니까? – verbsintransit

+1

OP에서 '200 OK'가 표시되면 @verbsintransit 분명히 그는 인증을했습니다. – woozyking

+0

API에 실제로 인증이 필요합니다. 단순화를 위해 인증 라인을 생략했습니다. 키를 게시 하겠지만 거래 내역과 연결되어 있습니다. 비 스트리밍 요청의 경우 요청 .json(). 여기에서도해야 할 수도 있습니다. 확실하지 않습니다. –

답변

2

짐작할 수 있을지 모르지만 TradeKing은 JSON blob 사이에 개행을 넣지 않습니다. 따라서 iter_content를 사용하여 바이트 단위로 바이트를 가져와 버퍼에 추가하고, 버퍼를 디코딩하고, 성공시 버퍼를 지우고 결과 객체를 생성해야합니다. :

+0

당신을 위해 일해 주어서 기뻐요!내가 한 일은 NodeJS를 사용하여 스트림을 듣고 ZeroMQ 인터페이스를 통해 오브젝트를 생성하여 파이썬 리스너와 마술을 맺는 것입니다. Python은 많은 양의 기호를 다룰 때 느려집니다. – krillr

9

verbsintransit에서 언급했듯이 인증 문제를 해결해야하지만 스트리밍 문제는 해결할 수 있습니다. 본 실시 예를 이용하여 에드 다음 line 실제 메시지 또는 연결 유지 단 접속 인 경우

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: 조건이 검사된다.

+1

고마워요! tmw 때까지 주식 시장이 완전히 그것을 테스트 열려 기다릴 에드. 나는 공부하고/그 동안 그것을 이해하려고 노력할 것이고, 일어날 일을 게시 할 것이다. –

+1

이 예제의 주요 비트는'send()'의'stream = True'입니다. 설정하지 않으면 Requests가 전체 본문을 다운로드하려고 시도합니다. 설명서에 사용중인 키워드가 표시됩니다. – Lukasa

+0

내가 가진 오류는 다음과 같습니다 : ConnectionError : ('Connection aborted.', RemoteDisconnected ('응답없이 원격 연결이 닫힌 연결',)) –