我正在使用tweepy处理大量的Twitter流(有4,000多个帐户)。我添加到流中的帐户越多,我越有可能遇到此错误:
Traceback (most recent call last):
File "myscript.py", line 2103, in <module>
main()
File "myscript.py", line 2091, in main
twitter_stream.filter(follow=USERS_TO_FOLLOW_STRING_LIST, stall_warnings=True)
File "C:\Python27\lib\site-packages\tweepy\streaming.py", line 445, in filter
self._start(async)
File "C:\Python27\lib\site-packages\tweepy\streaming.py", line 361, in _start
self._run()
File "C:\Python27\lib\site-packages\tweepy\streaming.py", line 294, in _run
raise exception
requests.packages.urllib3.exceptions.ProtocolError: ('Connection broken: IncompleteRead(0 bytes read, 2000 more expected)', IncompleteRead(0 bytes read, 2000 more expected))
显然,这是一个厚实的消防水带-从经验上显然,它太厚了以至于无法处理。基于对堆栈溢出错误的研究以及“我添加的帐户越多,出现此异常的速度越快”的经验趋势,我的假设是这是“我的错”。我对每条推文的处理时间太长和/或我的firehose太厚。我明白了。
但是尽管进行了这种设置,但我仍然有两个问题似乎无法为其找到可靠的答案。
1.有没有一种方法可以简单地“处理”此异常,接受我会错过一些推文,但保持脚本运行?我认为也许错过了一条推文(或许多条推文),但是如果我没有100%我想要的推文就可以生存,那么脚本/流仍然可以继续,随时准备捕捉下一条推文。
我已经尝试过这种异常处理,在关于stackoverflow的类似问题中对此建议这样做:
从urllib3.exceptions导入ProtocolError
while True:
try:
twitter_stream.filter(follow=USERS_TO_FOLLOW_STRING_LIST, stall_warnings=True)
except ProtocolError:
continue
但是对我来说不幸的是(也许我没有正确地实现它,但我认为我没有这样做),但那是行不通的。无论是否有建议的异常处理代码,我都会得到与以前相同的确切错误。
我可以将tweets的某种形式-在原始过程中-预处理过程中,写到一个线程上的内存,数据库或其他东西上吗?然后,准备好第二个线程准备好处理那些推文吗?我认为,至少,将推文的后处理排除在等式之外,这是我正在读取的消防水带带宽的限制因素。然后,如果仍然出现错误,我可以减少关注的对象,依此类推。
我看过一些线程教程,但是想知道是否可以“使用”这个tweepy/twitter/etc/complex。我对自己所遇到的问题或线程的帮助方式不甚了解,因此我想请教一下有关确实对我有帮助的建议。
如果这个想法是正确的,那么有人可以帮助我为正确的方向提供一些简单的示例代码吗?
最佳答案
我认为我终于完成了我的第一个队列/线程实现,从而解决了这个问题。我还没有足够的知识来了解执行此操作的最佳方法,但是我认为这种方法确实有效。使用下面的代码,我现在建立了一个新的推文队列,可以按我希望的顺序处理它们,而不是落后于tweepy并且失去与tweepy的联系。
from Queue import Queue
from threading import Thread
class My_Parser(tweepy.StreamListener):
def __init__(self, q = Queue()):
num_worker_threads = 4
self.q = q
for i in range(num_worker_threads):
t = Thread(target=self.do_stuff)
t.daemon = True
t.start()
def on_data(self, data):
self.q.put(data)
def do_stuff(self):
while True:
do_whatever(self.q.get())
self.q.task_done()
我确实继续就IncompleteRead错误进行了一段时间的挖掘,并尝试了更多使用url lib和http libs的异常处理解决方案,但我为此感到挣扎。而且我认为,除了保持连接之外,排队的东西还是有一些好处的(对于其中一个,不会丢失数据)。
希望这对某人有帮助。哈哈。