如何用urllib2/httplib调用Twitter的流式过滤接口?

0 投票
1 回答
894 浏览
提问于 2025-04-15 21:01

更新:

我把这个问题从“已回答”改回来了,因为我尝试了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会是更好的选择。

撰写回答