Не удается обработать исключение для сброса подключения при выполнении потоковой передачи Twitter в Python - PullRequest
0 голосов
/ 24 апреля 2019

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

Я создал скрипт, который будет транслировать твит в реальном времени в файл Excel. Много раз случалось так, что потоковая передача была отключена из-за ошибки ECONNRESET, которая является сбросом соединения одноранговым узлом -

Exception in thread Thread-1:
Traceback (most recent call last):
File “/usr/lib/python2.7/threading.py”, line 801, in __bootstrap_inner
self.run()
File “/usr/lib/python2.7/threading.py”, line 754, in run
self.__target(*self.__args, **self.__kwargs)
File “/usr/local/lib/python2.7/dist-packages/tweepy/streaming.py”, line 297, in _run
six.reraise(*exc_info)
File “/usr/local/lib/python2.7/dist-packages/tweepy/streaming.py”, line 266, in _run
self._read_loop(resp)
File “/usr/local/lib/python2.7/dist-packages/tweepy/streaming.py”, line 316, in _read_loop
line = buf.read_line().strip()
File “/usr/local/lib/python2.7/dist-packages/tweepy/streaming.py”, line 181, in read_line
self._buffer += self._stream.read(self._chunk_size)
File “/usr/local/lib/python2.7/dist-packages/urllib3/response.py”, line 430, in read
raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
File “/usr/lib/python2.7/contextlib.py”, line 35, in exit
self.gen.throw(type, value, traceback)
File “/usr/local/lib/python2.7/dist-packages/urllib3/response.py”, line 349, in _error_catcher
raise ProtocolError(‘Connection broken: %r’ % e, e)
ProtocolError: (‘Connection broken: error("(104, ‘ECONNRESET’)",)’, error("(104, ‘ECONNRESET’)",))

Это ошибка протокола, и я попытался ее перехватить, импортировав библиотеку urllib3, так как в ней есть исключения протокола, но блок try и exception не может ее подавить и продолжить потоковую передачу.

  import pandas as pd
  import csv
  from bs4 import BeautifulSoup
  import re
  import tweepy
  import ast
  from datetime import datetime
  import time
  from tweepy import Stream
  from tweepy import OAuthHandler  
  from tweepy.streaming import StreamListener
  import json
  from unidecode import unidecode
  from urllib3.exceptions import ProtocolError
  from urllib3.exceptions import IncompleteRead
  import requests

  consumer_key= 'xxxxxxxxx'
  consumer_secret= 'xxxxxxxxx'
  access_token= 'xxxxxxxxx'
  access_token_secret= 'xxxxxxxxx'


  with open('TEST_FEB.csv','w')as f:
       f.truncate()
       f.close()

class listener(StreamListener):

    def on_data(self,data):
        data1 = json.loads(data)
        time = data1["created_at"]
        if hasattr(data1,"retweeted_status:"):
            tweet = unidecode(data1["tweet"]["text"])
        if data1["truncated"] == "true":
            tweet = unidecode(data1["extended_tweet"]["full_text"])
        else:
            tweet = unidecode(data1["text"])
        tweet1 = BeautifulSoup(tweet, "lxml").get_text()
        url = "https://twitter.com/{}/status/{}".format(data1["user"] 
               ["screen_name"], data1["id_str"])
        file = open('TEST_FEB.csv', 'a')
        csv_writer = csv.writer(file)
        csv_writer.writerow([time, tweet1, url])
        file.close()

    def on_limit(self, track):
        return True

auth = OAuthHandler(consumer_key,consumer_secret)
auth.set_access_token(access_token,access_token_secret)

while True:
      try:
          twitterStream = Stream(auth, listener(), 
          wait_on_rate_limit=True, retry_count=10, stall_warnings=True)
          twitterStream.filter(track=["abcd"], async = True)

       except ProtocolError as error:
             print (str(error))
             continue

       except IncompleteRead as IR:
              print (str(IR))
              continue

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

...