使用Python检索Twitter数据时出现"IncompleteRead"错误

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)

其实我不知道该怎么办这个问题!!!

Lui*_*igi 7

您应该检查使用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个小时后可重复发生,则落后是一个不错的选择。


Wit*_*ail 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 的道路上走下去,所以希望您无论如何都能对此进行排序,但希望这对其他人有用!:)