5

Python Requests を使用して Twitter Streaming API を使用しようとしています。

ドキュメントに簡単な例があります:

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)

これを実行すると、requests.post()決して返されません。Twitter に確実に接続し、API からデータを受信して​​いることを実験して証明しました。ただし、応答オブジェクトを返す代わりに、Twitter が送信するのと同じ量のデータを消費するだけです。requests.post()上記のコードから判断すると、リアルタイムの結果を引き続き受け取ることができる Twitter down へのオープンな接続を持つ応答オブジェクトを返すことが期待できます。

(データを受信して​​いることを証明するために、別のシェルで同じ資格情報を使用して Twitter に接続すると、Twitter は最初の接続を閉じ、呼び出しは応答オブジェクトを返しました。このr.content属性には、接続が開いている間に受信したすべてのバックアップ データが含まれていました。 )

requests.postドキュメントには、提供されたすべてのデータを消費する前に返すために必要な他の手順については言及されていません。他の人は、この問題に遭遇することなく同様のコードを使用しているようです

私は使用しています:

  • パイソン 2.7
  • Ubuntu 11.04
  • リクエスト 0.14.0
4

2 に答える 2

10

プリフェッチをオフにする必要があります。これは、デフォルトを変更したパラメーターだと思います。

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)

requests 1.x の時点でパラメータの名前が変更されていることに注意してくださいstream=True

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)
于 2012-09-06T14:11:32.850 に答える
5

ああ、コードを読んで答えを見つけました。ある時点で、プリフェッチ パラメーターが post メソッド (およびその他のメソッドと思われます) に追加されました。

prefetch=Falseにkwarg を追加する必要がありましたrequests.post()

于 2012-09-06T14:08:46.267 に答える