Твипи OpenSSL.SSL.WantReadError

Питон 3.6. Я использую стример tweepy, чтобы получать твиты. Это работает хорошо. Но иногда, если я позволяю ему открываться более 24 часов, у меня возникает эта ошибка.

Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\requests\packages\urllib3\contrib\pyopenssl.py", line 277, in recv_into
return self.connection.recv_into(*args, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\OpenSSL\SSL.py", line 1547, in recv_into
self._raise_ssl_error(self._ssl, result)
    File "C:\ProgramData\Anaconda3\lib\site-packages\OpenSSL\SSL.py", line 1353, in _raise_ssl_error
raise WantReadError()
  OpenSSL.SSL.WantReadError

During handling of the above exception, another exception occurred:


Traceback (most recent call last):
 File "C:\ProgramData\Anaconda3\lib\site-packages\requests\packages\urllib3\contrib\pyopenssl.py", line 277, in recv_into
return self.connection.recv_into(*args, **kwargs)
    File "C:\ProgramData\Anaconda3\lib\site-packages\OpenSSL\SSL.py", line 1547, in recv_into
self._raise_ssl_error(self._ssl, result)
  File "C:\ProgramData\Anaconda3\lib\site-packages\OpenSSL\SSL.py", line 1370, in _raise_ssl_error
raise SysCallError(errno, errorcode.get(errno))
OpenSSL.SSL.SysCallError: (10054, 'WSAECONNRESET')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\requests\packages\urllib3\response.py", line 302, in _error_catcher
yield
  File "C:\ProgramData\Anaconda3\lib\site-packages\requests\packages\urllib3\response.py", line 384, in read
data = self._fp.read(amt)
  File "C:\ProgramData\Anaconda3\lib\http\client.py", line 449, in read
n = self.readinto(b)
  File "C:\ProgramData\Anaconda3\lib\http\client.py", line 483, in readinto
return self._readinto_chunked(b)
  File "C:\ProgramData\Anaconda3\lib\http\client.py", line 578, in _readinto_chunked
chunk_left = self._get_chunk_left()
  File "C:\ProgramData\Anaconda3\lib\http\client.py", line 546, in _get_chunk_left
chunk_left = self._read_next_chunk_size()
  File "C:\ProgramData\Anaconda3\lib\http\client.py", line 506, in _read_next_chunk_size
line = self.fp.readline(_MAXLINE + 1)
  File "C:\ProgramData\Anaconda3\lib\socket.py", line 586, in readinto
return self._sock.recv_into(b)
  File "C:\ProgramData\Anaconda3\lib\site-packages\requests\packages\urllib3\contrib\pyopenssl.py", line 293, in recv_into
return self.recv_into(*args, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\requests\packages\urllib3\contrib\pyopenssl.py", line 282, in recv_into
raise SocketError(str(e))
OSError: (10054, 'WSAECONNRESET')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 916, in _bootstrap_inner
self.run()
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
 File "twitter_aspi_v0.8.py", line 179, in _init_stream
tweepy.Stream(auth, listener).userstream()
  File "C:\ProgramData\Anaconda3\lib\site-packages\tweepy\streaming.py", line 396, in userstream
self._start(async)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tweepy\streaming.py", line 363, in _start
self._run()
  File "C:\ProgramData\Anaconda3\lib\site-packages\tweepy\streaming.py", line 296, in _run
raise exception
  File "C:\ProgramData\Anaconda3\lib\site-packages\tweepy\streaming.py", line 265, in _run
self._read_loop(resp)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tweepy\streaming.py", line 315, in _read_loop
line = buf.read_line().strip()
  File "C:\ProgramData\Anaconda3\lib\site-packages\tweepy\streaming.py", line 180, in read_line
self._buffer += self._stream.read(self._chunk_size)
  File "C:\ProgramData\Anaconda3\lib\site-packages\requests\packages\urllib3\response.py", line 401, in read
raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
  File "C:\ProgramData\Anaconda3\lib\contextlib.py", line 100, in __exit__
self.gen.throw(type, value, traceback)
  File "C:\ProgramData\Anaconda3\lib\site-packages\requests\packages\urllib3\response.py", line 320, in _error_catcher
raise ProtocolError('Connection broken: %r' % e, e)
requests.packages.urllib3.exceptions.ProtocolError: ('Connection broken: OSError("(10054, \'WSAECONNRESET\')",)', OSError("(10054, 'WSAECONNRESET')",))

Мой код довольно длинный, и что касается ошибки, похоже, что она исходит от urllib3, OpenSSL и tweepy способа доступа к Twitter API. Так что я мог бы справиться с этим с помощью try перед запуском стримера, но я хотел бы знать, может быть, есть лучшее исправление, которое я мог бы сделать, чтобы понять и избежать этого? Спасибо!


person TmSmth    schedule 28.03.2018    source источник
comment
Где твой код?   -  person Morse    schedule 01.04.2018
comment
Вы запускаете этот код дома или на сервере?   -  person Tarun Lalwani    schedule 01.04.2018
comment
@Prateek, как я уже сказал, мой код не обрабатывает часть соединения, я просто запускаю стример tweepy с одной функцией, а затем tweepy обрабатывает соединение   -  person TmSmth    schedule 01.04.2018
comment
@TarunLalwani На сервере он работает в 90% случаев, но иногда останавливается с этой ошибкой.   -  person TmSmth    schedule 01.04.2018
comment
Это больше похоже на временный тайм-аут соединения, который не обрабатывается Tweepy, поэтому вам нужно просто написать оболочку вокруг того же, поймать исключение и перезапустить его. Я не думаю, что исключения можно избежать как такового, потому что вы подключаетесь к внешнему сайту, и иногда может истечь время ожидания.   -  person Tarun Lalwani    schedule 01.04.2018
comment
@TarunLalwani хорошо, я хотел убедиться, спасибо!   -  person TmSmth    schedule 01.04.2018
comment
Вы должны посмотреть на этот docs.tweepy.org/en/v3 .5.0/streaming_how_to.html#handling-errors для части обработки ошибок и посмотрите, вызывается ли on_error в вашем случае, когда происходит тайм-аут соединения.   -  person Tarun Lalwani    schedule 01.04.2018
comment
Проверьте лимиты на сайте 1 2 3 нет альтернативы перезапуску потокового подключения через tweepy   -  person Morse    schedule 04.04.2018


Ответы (2)


Это больше похоже на временный тайм-аут соединения, который не обрабатывается Tweepy, поэтому вам нужно просто написать оболочку вокруг того же, поймать исключение и перезапустить его. Я не думаю, что исключения можно избежать как такового, потому что вы подключаетесь к внешнему сайту, и иногда может истечь время ожидания.

Вы должны посмотреть на этот http://docs.tweepy.org/en/v3.5.0/streaming_how_to.html#handling-errors для части обработки ошибок и посмотрите, вызывается ли on_error в вашем случае, когда происходит тайм-аут соединения

class MyStreamListener(tweepy.StreamListener):

    def on_error(self, status_code):
        if status_code == 420:
            #returning False in on_data disconnects the stream
            return False

Если это не поможет, используйте подход-оболочку

person Tarun Lalwani    schedule 07.04.2018

Согласно документации для разработчиков Twitter: ограничение скорости ожидается, что сброс/сбой подключения при превышении лимита использования.

Запросы / 15-минутное окно (авторизация пользователя) = 900

Запросы / 15-минутное окно (авторизация приложения) = 1500

Также в нем четко указано, как показано ниже.

Если первоначальная попытка переподключения не удалась, ваш клиент должен продолжать попытки переподключения, используя шаблон экспоненциальной отсрочки, пока он не будет успешно переподключен.

(Обновить)

Независимо от того, как ваш клиент отключается, вы должны настроить свое приложение для немедленного повторного подключения. Если ваша первая попытка повторного подключения оказалась неудачной, мы рекомендуем вашему приложению внедрить экспоненциальный шаблон отсрочки при последующих попытках повторного подключения (например, подождать 1 секунду, затем 2 секунды, затем 4, 8, 16 и т. д.) с некоторым разумным верхним пределом. Если этот верхний предел достигнут, вы должны настроить свой клиент для уведомления вашей команды, чтобы вы могли продолжить расследование.

Стандартные (бесплатные) API Twitter, т. е. Tweepy API, состоят из REST API и Streaming API. Streaming API обеспечивает доступ к твитам с малой задержкой. Ads API имеет другие ограничения при включении в белый список.

Ограничение API REST

Клиенты могут получить доступ к теоретическому максимуму 3200 статусов через страницу и параметры подсчета для методов REST API user_timeline. Другие методы временной шкалы имеют теоретический максимум 800 статусов. Запросы, превышающие лимит, приведут к ответу с кодом состояния 200 и пустым результатом в запрошенном формате. Twitter по-прежнему поддерживает базу данных всех твитов, отправленных пользователем. Однако для обеспечения производительности это ограничение применяется к вызовам API.

Может быть простая причина, по которой пользователи не должны спамить, что эта вещь применяется.

Решение :

Вы можете поймать exception и восстановить соединение с Twitter и продолжить чтение твитов.

К сожалению, на данный момент нет другой альтернативы, кроме как получить больше разрешений на использование от Twitter.

person Morse    schedule 07.04.2018
comment
Спасибо за ваш ответ, но поскольку я использую потоковый API, ограничение не совпадает с ограничением Rest API. И у меня уже была ошибка ограничения скорости с потоковым API, и ошибка не такая, как та, которую я опубликовал - person TmSmth; 07.04.2018