Han*_*ana 8 python twitter tweepy python-2.7
在运行此程序以使用Python 2.7.8检索Twitter数据时:
#imports
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
#setting up the keys
consumer_key = '…………...'
consumer_secret = '………...'
access_token = '…………...'
access_secret = '……………..'
class TweetListener(StreamListener):
# A listener handles tweets are the received from the stream.
#This is a basic listener that just prints received tweets to standard output
def on_data(self, data):
print (data)
return True
def on_error(self, status):
print (status)
#printing all the tweets to the standard output
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
stream = Stream(auth, TweetListener())
t = u"?????"
stream.filter(track=[t])
Run Code Online (Sandbox Code Playgroud)
运行此程序5小时后,我收到此错误消息:
Traceback (most recent call last):
File "/Users/Mona/Desktop/twitter.py", line 32, in <module>
stream.filter(track=[t])
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tweepy/streaming.py", line 316, in filter
self._start(async)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tweepy/streaming.py", line 237, in _start
self._run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tweepy/streaming.py", line 173, in _run
self._read_loop(resp)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tweepy/streaming.py", line 225, in _read_loop
next_status_obj = resp.read( int(delimited_string) )
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 543, in read
return self._read_chunked(amt)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 612, in _read_chunked
value.append(self._safe_read(chunk_left))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 660, in _safe_read
raise IncompleteRead(''.join(s), amt)
IncompleteRead: IncompleteRead(0 bytes read, 976 more expected)
>>>
Run Code Online (Sandbox Code Playgroud)
其实我不知道该怎么办这个问题!!!
您应该检查使用stall_warnings参数是否足够快地处理推文。
stream.filter(track=[t], stall_warnings=True)
Run Code Online (Sandbox Code Playgroud)
这些消息由Tweepy处理(在此处签出实现),如果您落后于您,则会通知您。落后意味着您无法像Twitter API向您发送推文一样快速处理推文。从Twitter文档:
如果客户端处于断开连接的危险中,则将此参数设置为字符串true将导致定期发送消息。这些消息仅在客户端落后时发送,并且将以大约每5分钟一次的最大速率发生。
理论上,在这种情况下,您应该从API 收到断开连接消息。但是,情况并非总是如此:
流API将尝试传递一条消息,指示关闭流的原因。请注意,如果断开连接是由于网络问题或客户端读取速度太慢,则可能不会收到此消息。
这IncompleteRead也可能是由于暂时的网络问题,可能再也不会发生了。如果在大约5个小时后可重复发生,则落后是一个不错的选择。
我刚遇到这个问题。另一个答案实际上是正确的,因为它几乎可以肯定:
就我而言,我正在将推文读入 postgres 以供以后分析,跨越相当密集的地理区域,以及关键字(实际上,伦敦和大约 100 个关键字)。很有可能,即使你只是在打印它,你的本地机器正在做很多其他的事情,系统进程获得优先权,所以推文会备份,直到 Twitter 断开你的连接。(这通常表现为明显的内存泄漏 - 程序的大小会增加,直到它被杀死,或者 twitter 断开连接 - 以先到者为准。)
这里有意义的是将处理推到队列中。因此,我使用了 redis 和 django-rq 解决方案 - 在开发人员和我的生产服务器上实施大约需要 3 个小时,包括研究、安装、重新调整现有代码、对我的安装、测试和拼写错误的愚蠢行为.
现在,在您的 django 目录中(在适当的情况下 - ymmv 用于直接 python 应用程序)运行:
python manage.py rqworker &
你现在有一个队列!您可以通过像这样更改处理程序来添加作业:(在文件顶部)
import django_rq
Run Code Online (Sandbox Code Playgroud)
然后在您的处理程序部分:
def on_data(self, data):
django_rq.enqueue(print, data)
return True
Run Code Online (Sandbox Code Playgroud)
顺便说一句 - 如果您对源自叙利亚的东西感兴趣,而不仅仅是提及叙利亚,那么您可以像这样添加到过滤器中:
stream.filter(track=[t], locations=[35.6626, 32.7930, 42.4302, 37.2182]
这是一个以叙利亚为中心的非常粗糙的地理框,但它会在边缘拾取一些伊拉克/土耳其。由于这是一个可选的附加项,因此值得指出:
边界框不充当其他过滤器参数的过滤器。例如 track=twitter&locations=-122.75,36.8,-121.75,37.8 将匹配包含术语 Twitter(甚至非地理推文)或来自旧金山地区的任何推文。
编辑:我从您随后的帖子中看到您仍在使用 Twitter API 的道路上走下去,所以希望您无论如何都能对此进行排序,但希望这对其他人有用!:)