maximum recursion depth exceeded while calling a Python object спустя час работы
Изучаю парсер, решил написать прогу которая будет парсить значение криптовалют, вроде все работает, но через час вываливаются ошибки:
Traceback (most recent call last):
File "F:\Projects py\progect\CryptoCourse\main.py", line 52, in <module>
Crypto_course()
File "F:\Projects py\progect\CryptoCourse\main.py", line 17, in __init__
Crypto_course.loop()
File "F:\Projects py\progect\CryptoCourse\main.py", line 50, in loop
Crypto_course.loop()
File "F:\Projects py\progect\CryptoCourse\main.py", line 50, in loop
Crypto_course.loop()
File "F:\Projects py\progect\CryptoCourse\main.py", line 50, in loop
Crypto_course.loop()
[Previous line repeated 970 more times]
File "F:\Projects py\progect\CryptoCourse\main.py", line 46, in loop
Crypto_course.course_parser(PYRK_RUB, 'Pyrk')
File "F:\Projects py\progect\CryptoCourse\main.py", line 22, in course_parser
full_page = requests.get(NAME_RUB, headers=headers)
File "C:\Python\lib\site-packages\requests\api.py", line 75, in get
return request('get', url, params=params, **kwargs)
File "C:\Python\lib\site-packages\requests\api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Python\lib\site-packages\requests\sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python\lib\site-packages\requests\sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "C:\Python\lib\site-packages\requests\adapters.py", line 439, in send
resp = conn.urlopen(
File "C:\Python\lib\site-packages\urllib3\connectionpool.py", line 699, in urlopen
httplib_response = self._make_request(
File "C:\Python\lib\site-packages\urllib3\connectionpool.py", line 445, in _make_request
six.raise_from(e, None)
File "<string>", line 3, in raise_from
File "C:\Python\lib\site-packages\urllib3\connectionpool.py", line 440, in _make_request
httplib_response = conn.getresponse()
File "C:\Python\lib\http\client.py", line 1347, in getresponse
response.begin()
File "C:\Python\lib\http\client.py", line 331, in begin
self.headers = self.msg = parse_headers(self.fp)
File "C:\Python\lib\http\client.py", line 225, in parse_headers
return email.parser.Parser(_class=_class).parsestr(hstring)
File "C:\Python\lib\email\parser.py", line 67, in parsestr
return self.parse(StringIO(text), headersonly=headersonly)
File "C:\Python\lib\email\parser.py", line 56, in parse
feedparser.feed(data)
File "C:\Python\lib\email\feedparser.py", line 176, in feed
self._call_parse()
File "C:\Python\lib\email\feedparser.py", line 180, in _call_parse
self._parse()
File "C:\Python\lib\email\feedparser.py", line 295, in _parsegen
if self._cur.get_content_maintype() == 'message':
File "C:\Python\lib\email\message.py", line 594, in get_content_maintype
ctype = self.get_content_type()
File "C:\Python\lib\email\message.py", line 578, in get_content_type
value = self.get('content-type', missing)
File "C:\Python\lib\email\message.py", line 471, in get
return self.policy.header_fetch_parse(k, v)
File "C:\Python\lib\email\_policybase.py", line 316, in header_fetch_parse
return self._sanitize_header(name, value)
File "C:\Python\lib\email\_policybase.py", line 287, in _sanitize_header
if _has_surrogates(value):
File "C:\Python\lib\email\utils.py", line 57, in _has_surrogates
s.encode()
RecursionError: maximum recursion depth exceeded while calling a Python object
Process finished with exit code 1
Сам код:
import requests
from bs4 import BeautifulSoup
import time
import datetime
PYRK_RUB = 'https://coinmarketcap.com/ru/currencies/pyrk/'
BITCOIN_RUB = 'https://coinmarketcap.com/ru/currencies/bitcoin/'
ETHEREUM_RUB = 'https://coinmarketcap.com/ru/currencies/ethereum/'
headers = {'User-Agent': }
old_value = dict.fromkeys(['difference', 'Pyrk', 'Bitcoin', 'Ethereum'])
class Crypto_course:
def __init__(self):
Crypto_course.loop()
# Парсер курса криптовалют
def course_parser(NAME_RUB, nameCrypto):
#
full_page = requests.get(NAME_RUB, headers=headers)
#
soup = BeautifulSoup(full_page.content, 'html.parser')
#
convert = soup.findAll("div", {"class": "priceValue"})
global old_value
new_value = convert[0].text.replace('₽', '')
dt = datetime.datetime.today().strftime("%A %d.%m.%Y %H:%M:%S")
new_value = round(float(new_value.replace(',', '')), 2) # Округление конченое
if new_value != old_value[f'{nameCrypto}']:
if old_value[f'{nameCrypto}'] != None and new_value > old_value[f'{nameCrypto}']:
old_value['difference'] = round(new_value - old_value[f'{nameCrypto}'], 2)
print(f'{dt}| 1 {nameCrypto} = {new_value}₽.', '+', old_value['difference'], '₽')
old_value[f'{nameCrypto}'] = new_value
elif old_value[f'{nameCrypto}'] != None and new_value < old_value[f'{nameCrypto}']:
old_value['difference'] = round(old_value[f'{nameCrypto}'] - new_value, 2)
print(f'{dt}| 1 {nameCrypto} = {new_value}₽.', '-', old_value['difference'], '₽')
old_value[f'{nameCrypto}'] = new_value
else:
print(f'{dt}| 1 {nameCrypto} = {new_value}₽')
old_value[f'{nameCrypto}'] = new_value
# Зацикливание
def loop():
Crypto_course.course_parser(PYRK_RUB, 'Pyrk')
Crypto_course.course_parser(BITCOIN_RUB, 'Bitcoin')
Crypto_course.course_parser(ETHEREUM_RUB, 'Ethereum')
time.sleep(3)
Crypto_course.loop()
Crypto_course()
Почему выскакивают куча ошибок спустя час? Если видите что-то неправильно описаное просьба указать так же если даже не относится к ошибкам. ООП так же только начал изучать.
Так же, в самом начале вываливаются ошибки:
C:\Python\lib\site-packages\numpy\_distributor_init.py:30: UserWarning: loaded more than 1 DLL from .libs:
C:\Python\lib\site-packages\numpy\.libs\libopenblas.WCDJNK7YVMPZQ2ME2ZZHJJRJ3JIKNDB7.gfortran-win_amd64.dll
C:\Python\lib\site-packages\numpy\.libs\libopenblas.XWYDX2IKJW2NMTWSFYNGFUWKQU3LYTCZ.gfortran-win_amd64.dll
warnings.warn("loaded more than 1 DLL from .libs:"
Ответы (1 шт):
Автор решения: GrAnd
→ Ссылка
Ну так у вас Crypto_course.loop() зовёт сам семя в конце, отсюда и рекурсия. А она в Питоне не бесконечная (по-умолчанию ограничение 1000 вложенных вызовов). Так что через 3секунд*1000итераций (плюс время на распарсивание) оно и выпадет в ошибку.
Почему бы просто не написать бесконечный цикл?
def loop():
while True:
Crypto_course.course_parser(PYRK_RUB, 'Pyrk')
Crypto_course.course_parser(BITCOIN_RUB, 'Bitcoin')
Crypto_course.course_parser(ETHEREUM_RUB, 'Ethereum')
time.sleep(3)