我一直在尝试使用Python请求来使用Twitter Streaming API。
文档中有simple example:
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
返回所需的任何其他步骤。其他人似乎使用类似的代码而没有遇到这个问题,例如here
我正在使用:
答案 0 :(得分: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
框架中,使用stream
代替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 :(得分:5)
我只需要将prefetch=False
kwarg添加到requests.post()
。