2014-10-29 2 views
6

При выполнении этой программы для извлечения данных с использованием Twitter Python 2.7.8:Ошибка «IncompleteRead» при получении данных с использованием Twitter Python

#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]) 

после запуска этой программы в течение 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) 
>>> 

На самом деле я не знаю, что делать с этой проблемой !!!

+1

https://github.com/tweepy/tweepy/pull/498 Это было исправлено недавно. Убедитесь, что вы используете последний Tweepy – Luigi

+0

Спасибо, я попробую, и я обновлю статус – Hana

+0

на самом деле, когда я устанавливаю, что «pip install tweepy» - новая версия tweepy в терминале MAC OSX, я получил это сообщение «Требование уже выполнено (используйте --upgrade to upgrade): tweepy in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages Очистка ...», пожалуйста, как я могу перезаписать предыдущая версия? – Hana

ответ

1

Вы должны проверить, не слишком ли быстро обрабатываете твиты, используя параметр stall_warnings.

stream.filter(track=[t], stall_warnings=True) 

Эти сообщения обрабатываются Tweepy (проверить выполнение here) и сообщит вам, если вы отстали. Падение означает, что вы не можете обрабатывать твиты так же быстро, как API Twitter отправляет их вам. Из документов Twitter:

Установка этого параметра в строку true приведет к доставке периодических сообщений, если клиенту угрожает отсоединение. Эти сообщения отправляются только тогда, когда клиент отстает, и будет происходить с максимальной скоростью примерно раз в 5 минут.

В теории вы должны получить disconnect message от API в этой ситуации. Однако это не всегда так:

Потоковый API попытается доставить сообщение о том, почему поток был закрыт. Обратите внимание, что если отключение связано с проблемами сети или чтением клиента слишком медленно, возможно, что это сообщение не будет получено.

IncompleteRead также может быть вызван временной сетевой проблемой и, возможно, никогда не повторится. Если это происходит воспроизводимо примерно через 5 часов, то отставание - довольно хорошая ставка.

2

У меня была эта проблема. Другой ответ фактически является правильным, в том, что это почти наверняка:

  • Ваша программа не отставать от потока
  • вы получите предупреждение стойло, если это так.

В моем случае я читал твиты в postgres для последующего анализа на довольно плотной географической территории, а также ключевые слова (в Лондоне, и около 100 ключевых слов). Вполне возможно, что, даже если вы просто печатаете его, ваша локальная машина выполняет множество других функций, а системные процессы становятся приоритетными, поэтому твиты будут работать до тех пор, пока Twitter не отключит вас. (Это типично проявляется как кажущаяся утечка памяти - программа увеличивается в размере до тех пор, пока она не будет убита, или отключите твиттер - в зависимости от того, что наступит раньше.)

То, что имело смысл здесь, заключалось в том, чтобы оттолкнуть обработку в очередь. Таким образом, я использовал решение redis и django-rq - потребовалось около 3 часов для внедрения на dev, а затем на моем рабочем сервере, включая исследования, установку, пересоздание существующего кода, глупость в отношении моей установки, тестирования и орфографических ошибок, поскольку я пошел ,

Теперь в каталоге Джанго (в случае необходимости - YMMV для прямых приложений Python) пробег: python manage.py rqworker &

У вас теперь есть очередь! Вы можете добавить работу к тому, что, как, изменяя обработчик следующим образом: (В верхней части файла)

import django_rq 

Затем в секции обработчика:

def on_data(self, data): 
    django_rq.enqueue(print, data) 
    return True 

Как и в сторону - если вы заинтересованы в хламе исходящего из Сирии, а не просто упоминая Сирии, то вы могли бы добавить к фильтру, как это:

stream.filter(track=[t], locations=[35.6626, 32.7930, 42.4302, 37.2182]

Это очень грубый геобокс, сосредоточенный на Сирии, но который будет собирать кусочки Ирака и Турции по краям. Так как это дополнительный вариант, стоит обратить внимание на это:

Ограничительные коробки не действуют как фильтры для других параметров фильтра. Для пример track = twitter & places = -122.75,36.8, -121.75,37.8 будет соответствовать любые твиты, содержащие термин Twitter (даже негео-твиты) ИЛИ ближайшие из области Сан-Франциско.

From this answer, который мне помог, and the twitter docs.

Редактировать: Я вижу из ваших последующих сообщений, что вы все еще идете по пути использования API-интерфейса Twitter, поэтому, надеюсь, вы все равно отсортированы, но, надеюсь, это будет полезно для кого-то еще! :)

+0

Поскольку у меня только что поднялся за это, который вернул меня, было бы здорово, если бы вы могли выбрать один из ответов, если они обращаются (ed) ваша проблема @hana - либо моя, либо luigi. :) – Withnail