5

我一直在尝试使用 Python 请求来使用 Twitter 流 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 建立开放连接的响应对象,我可以继续接收实时结果。

(为了证明它正在接收数据,我在另一个 shell 中使用相同的凭据连接到 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=Falsekwarg 到requests.post().

于 2012-09-06T14:08:46.267 回答