request.exceptions.ChunkedEncodingError: ('Соединение разорвано: IncompleteRead(прочитано 0 байт, ожидается 512)), IncompleteRead

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

class TwitterClient(object):


def __init__(self):

    # keys and tokens from the Twitter Dev Console
    consumer_key = 'XXXXXXXXX'
    consumer_secret = 'XXXXXXXXX'
    access_token = 'XXXXXXXXX'
    access_token_secret = 'XXXXXXXXX'
    api = Api(consumer_key, consumer_secret, access_token, access_token_secret)

    def preprocess(tweet, ascii=True, ignore_rt_char=True, ignore_url=True, ignore_mention=True, ignore_hashtag=True,letter_only=True, remove_stopwords=True, min_tweet_len=3):
        sword = stopwords.words('english')

        if ascii:  # maybe remove lines with ANY non-ascii character
            for c in tweet:
                if not (0 < ord(c) < 127):
                    return ''

        tokens = tweet.lower().split()  # to lower, split
        res = []

        for token in tokens:
            if remove_stopwords and token in sword: # ignore stopword
                continue
            if ignore_rt_char and token == 'rt': # ignore 'retweet' symbol
                continue
            if ignore_url and token.startswith('https:'): # ignore url
                continue
            if ignore_mention and token.startswith('@'): # ignore mentions
                continue
            if ignore_hashtag and token.startswith('#'): # ignore hashtags
                continue
            if letter_only: # ignore digits
                if not token.isalpha():
                    continue
            elif token.isdigit(): # otherwise unify digits
                token = '<num>'

            res += token, # append token

        if min_tweet_len and len(res) < min_tweet_len: # ignore tweets few than n tokens
            return ''
        else:
            return ' '.join(res)

    for line in api.GetStreamSample():            
        if 'text' in line and line['lang'] == u'en': # step 1
            text = line['text'].encode('utf-8').replace('\n', ' ') # step 2
            p_t = preprocess(text)

    # attempt authentication
    try:
        # create OAuthHandler object
        self.auth = OAuthHandler(consumer_key, consumer_secret)
        # set access token and secret
        self.auth.set_access_token(access_token, access_token_secret)
        # create tweepy API object to fetch tweets
        self.api = tweepy.API(self.auth)
    except:
        print("Error: Authentication Failed")

Предположим, что все необходимые библиотеки импортированы. Ошибка в строке 69.

for line in api.GetStreamSample():            
    if 'text' in line and line['lang'] == u'en': # step 1
        text = line['text'].encode('utf-8').replace('\n', ' ') # step 2
        p_t = preprocess(text)

Я попытался проверить в Интернете причину ошибки, но не смог найти никакого решения.

Ошибка была:

requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read, 512 more expected)', IncompleteRead(0 bytes read, 512 more expected))

Я использую Python 2.7 и запрашиваю версию 2.14, самую последнюю.

4 ответа

Если при отправке запроса для потока установлено значение True, Requests не сможет освободить соединение обратно в пул, если вы не используете все данные или не вызовете Response.close. Это может привести к неэффективности соединений. Если вы обнаружите, что частично читаете тела запросов (или вообще не читаете их) при использовании stream=True, вы должны сделать запрос в операторе with, чтобы он всегда был закрыт:

с request.get (' http://httpbin.org/get', stream = True) как r: # Делайте что-то с ответом здесь.

У меня была та же проблема, но без потока, и, как сказал stone mini, просто примените предложение "with" перед тем, как убедиться, что ваш запрос закрыт перед новым запросом.

    with requests.request("POST", url_base, json=task, headers=headers) as report:
        print('report: ', report)

на самом деле проблема с вашим приложением на основе django2.7 или более ранней версии. что версии django по умолчанию позволяли загружать данные размером 2,5 МБ для тела запроса.

Я столкнулся с той же проблемой с приложением на основе django2.7, я только что обновил файл setting.py своего приложения django, в котором работали мои URL-адреса (конечные точки).

      DATA_UPLOAD_MAX_MEMORY_SIZE = None

Я просто добавляю указанную выше переменную в файл settings.py моего приложения. вы также можете прочитать об этом здесь

Я почти уверен, что это сработает для вас.

Для тех, кто просто хочет избежать ошибки и повторно попробовать соединение, как я, может помочь что-то вроде этого:

      r = ''
while r == '':
    try:
        r = requests.get(Url, headers = headers)
    except (requests.exceptions.ConnectionError, requests.exceptions.ChunkedEncodingError) as err:
        log_(err + ' Put to sleep before retrying.')
        time.sleep(100)
        continue

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

Другие вопросы по тегам