Entendiendo el streaming de Python HTTP

Estoy teniendo problemas para acceder a una API de transmisión mediante Python y Requests.

Lo que dice la API: “Hemos habilitado un punto final de transmisión para solicitar datos de cotización e intercambio utilizando una conexión de socket HTTP persistente. La transmisión de datos desde la API consiste en realizar una solicitud HTTP autenticada y dejar el socket HTTP abierto para recibir datos continuamente. . ”

Cómo he estado intentando acceder a los datos:

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']) 

Los documentos de Solicitudes aquí muestran dos cosas de interés: use un generador / iterador para usar con datos fragmentados, que se pasa en el campo de datos. Para la transmisión de datos, sugiere el uso de código como:

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

Ninguno parece funcionar, aunque no tengo idea de qué poner en la función del generador, ya que el ejemplo no está claro. Usando r.iter_lines (), obtengo la salida: “b ‘{” status “:” connected “} {” status “: disconnected”}’ ”

Puedo acceder a los encabezados, y la respuesta es HTTP 200, pero no puedo obtener datos válidos, o encontrar ejemplos claros sobre cómo acceder a la transmisión de datos HTTP en Python. Cualquier ayuda sería apreciada. La API recomienda usar Jetty para Java para mantener el flujo abierto, pero no estoy seguro de cómo hacerlo en Python.

Encabezados: {‘connection’: ‘keep-alive’, ‘content-type’: ‘application / json’, ‘x-powered-by’: ‘Express’, ‘transfer-encoding’: ‘chunked’}

No estoy seguro si resolvió esto, pero TradeKing no pone nuevas líneas entre sus blobs JSON. Por lo tanto, tiene que usar iter_content para obtenerlo byte a byte, adjuntar ese byte a un búfer, intentar descodificar el búfer, borrar el búfer y producir el objeto resultante. 🙁

Como ha indicado Verbsintransit, debe resolver sus problemas de autenticación; sin embargo, sus problemas de transmisión pueden solucionarse con este ejemplo:

 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() 

La condición if line: comprueba si la line es un mensaje real o solo una conexión keep-alive.