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 секунд, как в этом случае) и повторите попытку подключения. Обратите внимание, что если ошибка разрыва соединения сохраняется, вышеуказанный скрипт будет пытаться бесконечно ... Возможно, вы захотите добавить счетчик, чтобы остановить его, прежде чем пытаться слишком долго.