请求流示例在我的环境中不起作用



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

(为了证明它正在接收数据,我在另一个shell中使用相同的凭据连接到Twitter,于是Twitter关闭了第一个连接,调用返回了响应对象。r.content属性包含连接打开时接收到的所有备份数据。)

该文档没有提及在使用所有提供的数据之前导致requests.post返回所需的任何其他步骤。其他人似乎在使用类似的代码而没有遇到这个问题,例如这里。

我正在使用:

  • Python 2.7
  • Ubuntu 11.04
  • 请求0.14.0

您需要关闭预取,我认为这是一个更改默认值的参数:

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)

请注意,从请求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)

啊,我通过阅读代码找到了答案。在某个时刻,post方法(我想还有其他方法)中添加了一个预取参数。

我只需要在requests.post()中添加一个prefetch=FalseKwarg。

相关内容

  • 没有找到相关文章

最新更新