Вопрос:

«IncompleteRead» Ошибка при получении данных Twitter с использованием Python

python python-2.7 twitter tweepy

8437 просмотра

3 ответа

67 Репутация автора

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

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

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

Автор: Hana Источник Размещён: 29.10.2014 06:47

Ответы (3)


7 плюса

3604 Репутация автора

Вы должны проверить, достаточно ли быстро вы можете обработать твиты с помощью stall_warningsпараметра.

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

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

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

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

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

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

Автор: Luigi Размещён: 31.10.2014 01:47

2 плюса

2196 Репутация автора

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

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

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

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

Теперь в вашем каталоге django (где это уместно - 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 & location = -122.75,36.8, -121.75,37.8 будет соответствовать любым твитам, содержащим термин Twitter (даже не-гео-твиты) ИЛИ из области Сан-Франциско.

Из этого ответа , который мне помог, и из твиттера .

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

Автор: Withnail Размещён: 18.06.2015 01:14

0 плюса

16 Репутация автора

Это сработало для меня.

l = StdOutListener()
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
stream = Stream(auth, l)
while True:
    try:
        stream.filter(track=['python', 'java'], stall_warnings=True)
    except (ProtocolError, AttributeError):
        continue
Автор: Debjit Bhowmick Размещён: 13.06.2019 05:11
Вопросы из категории :
32x32