如何用urllib2/httplib调用Twitter的流式过滤接口?
更新:
我把这个问题从“已回答”改回来了,因为我尝试了Nick的答案中提到的解决方案,改用了谷歌的urlfetch:
logging.debug("starting urlfetch for http://%s%s" % (self.host, self.url))
result = urlfetch.fetch("http://%s%s" % (self.host, self.url), payload=self.body, method="POST", headers=self.headers, allow_truncated=True, deadline=5)
logging.debug("finished urlfetch")
但是不幸的是,finished urlfetch
这行从来没有被打印出来——我在日志中看到超时发生(5秒后返回200),但执行似乎没有返回。
大家好,
我正在尝试使用Twitter的流式(也叫火hose)API,并且是在谷歌应用引擎上进行的(我知道这可能不是一个长期的好选择,因为你不能在GAE上保持连接一直打开),但到目前为止,我还没有成功让我的程序解析Twitter返回的结果。
一些代码:
logging.debug("firing up urllib2")
req = urllib2.Request(url="http://%s%s" % (self.host, self.url), data=self.body, headers=self.headers)
logging.debug("called urlopen for %s %s, about to call urlopen" % (self.host, self.url))
fobj = urllib2.urlopen(req)
logging.debug("called urlopen")
当这个代码执行时,不幸的是,我的调试输出从来没有显示出called urlopen
这一行。我怀疑发生的情况是Twitter保持连接打开,而urllib2没有返回,因为服务器没有终止连接。
Wireshark显示请求被正确发送,并且返回了结果。
我尝试在请求头中添加Connection: close
,但这并没有带来成功的结果。
有没有什么想法可以让这个工作?
1 个回答
1
在App Engine上,urllib其实是一个很简单的工具,它是对一个叫做urlfetch API的封装。你说的没错:Twitter的流媒体API不会结束它的响应,所以会超时,urlfetch就会抛出一个异常。
如果你直接使用urlfetch,你可以设置超时时间(最长10秒),并且可以把allow_truncated设置为True,这样你就能获取到部分结果。不过,Twitter的流媒体API其实不太适合App Engine,因为App Engine的请求执行时间限制在30秒,而urlfetch的请求不能逐步返回结果,也不能超过10秒。因此,使用Twitter的“标准”API会是更好的选择。