2012-09-06 13 views
5

He estado tratando de consumir la API de transmisión de Twitter utilizando las solicitudes de Python.El ejemplo de transmisión de solicitudes no funciona en mi entorno

Hay una simple example en la documentación:

import requests 
import json 

r = requests.post('https://stream.twitter.com/1/statuses/filter.json', 
    data={'track': 'requests'}, auth=('username', 'password')) 

for line in r.iter_lines(): 
    if line: # filter out keep-alive new lines 
     print json.loads(line) 

Cuando ejecuto esto, la llamada a requests.post() nunca regresa. Experimenté y probé que definitivamente se está conectando a Twitter y recibiendo datos de la API. Sin embargo, en lugar de devolver un objeto de respuesta, simplemente se queda consumiendo tantos datos como Twitter envía. A juzgar por el código anterior, esperaría que requests.post() devuelva un objeto de respuesta con una conexión abierta a Twitter para poder seguir recibiendo resultados en tiempo real.

(Para demostrar que estaba recibiendo datos, he conectado a Twitter utilizando las mismas credenciales en otra cáscara, después de lo cual Twitter cerró la primera conexión, y la llamada devuelve el objeto de respuesta. El atributo r.content contenía todos los datos de copia de seguridad recibidos mientras la conexión estaba abierta.)

La documentación no menciona ningún otro paso necesario para que requests.post regrese antes de consumir todos los datos suministrados. Otras personas parecen estar usando código similar sin encontrar este problema, p. here.

que estoy usando:

  • Python 2.7
  • Ubuntu 11.04
  • solicitudes 0.14.0

Respuesta

10

Es necesario apagar la obtención previa, que creo que es un parámetro que cambió por defecto:

r = requests.post('https://stream.twitter.com/1/statuses/filter.json', 
    data={'track': 'requests'}, auth=('username', 'password'), 
    prefetch=False) 

for line in r.iter_lines(): 
    if line: # filter out keep-alive new lines 
     print json.loads(line) 

ACTUALIZACIÓN: En el último marco requests, utilice stream en lugar de prefetch:

r = requests.post('https://stream.twitter.com/1/statuses/filter.json', 
    data={'track': 'requests'}, auth=('username', 'password'), 
    stream=True) 

for line in r.iter_lines(): 
    if line: # filter out keep-alive new lines 
     print json.loads(line) 
+1

¡Gracias! Acabo de enviar una solicitud de extracción para actualizar los documentos. – Gareth

5

Ah, he encontrado la respuesta al leer el código. En algún momento, se agregó un parámetro de captación previa al método de publicación (y otros métodos, supongo).

Solo necesitaba agregar un prefetch=False kwarg al requests.post().

+0

Lectura adicional sugiere que la captación previa ha sido un parámetro por un tiempo, pero su valor predeterminado se cambió a True en la versión 0.13.6. – Gareth

+1

:-) Justo cuando escribía la respuesta por usted. :-P –

Cuestiones relacionadas