Форум сайта python.su
На коленке написан бот, который парсит сайт и каждые 30 минут публикует пост в телеграмм канале.
Настроен ноутбук, который не засыпает и работает 24\7 аля Windows сервер.
Кейс:
В 23.00 вечера я запускаю бот Bot.py
Висит “черное окно”. Бот работает - новости публикуются.
С утра в 7.00 черного окна нет. Хотя все остальные программы работают.
Получается ночью, когда я сплю сладким сном, скрипт падает или винда его срубает.
Вопрос: как заставить бот работать “вечно”?
Офлайн
vortex604Добавь в этот скрипт журналирование (логирование) и после каждой успешной операции добавляй запись в лог в формате <дата><время><выполненная операция>. Если же происходит сбой, также в лог добавляй запись <дата><время><невыполненная операция><причина> . Так ты узнаешь, когда программа завершила выполнение.
На коленке написан бот, который парсит сайт и каждые 30 минут публикует пост в телеграмм канале.
Отредактировано py.user.next (Ноя. 17, 2022 23:50:08)
Офлайн
Кроме того оберни блок парсинга сайта и блок отправки сообщений в
try/except - даже если произойжет ошибка программу не выбросит и напишет тебе лог
Далее нужно проанализировать данные лога, найти и устранить причину падения
Офлайн
можно кхм кхм еще запилить проверку работы скрита типа ежеле нет то kill его (на всякий случай) и и потом запуск ну это при условии что это ос не причем а возникает ошибка в работе етого бот.пи
Офлайн
Можете помочь с кодом?
Попробовал добавить loguru, но файл все время пустой
import telebot import requests import time import fake_useragent from loguru import logger logger.add("runtime.log") from bs4 import BeautifulSoup token = "" channel_id = "@" bot = telebot.TeleBot(token) @logger.catch @bot.message_handler(content_types=['text']) def commands(message): #bot.send_message(channel_id, message.text) if message.text == "Старт": #bot.send_message(channel_id, "Hello") back_post_id = None while True: post_text = parser(back_post_id) back_post_id = post_text[1] if post_text[0] != None: bot.send_message(channel_id, post_text[0]) time.sleep(1800) else: bot.send_message(message.from_user.id, "Я тебя не понимаю. Напиши Старт") @logger.catch def parser(back_post_id): URL = "" user = fake_useragent.UserAgent().random header = {'user-agent': user} page = requests.get(URL, headers=header) soup = BeautifulSoup(page.content, "html.parser") post = soup.find('section', class_='post-content', id=True) post_id = post["id"] if post_id != back_post_id: title = post.find('h2').text description = post.find('p').text link = post.find('a') url = link.attrs['href'] return f"{title}\n\n{description}\n\n{url}", post_id else: return None, post_id bot.polling()
Отредактировано vortex604 (Ноя. 19, 2022 07:23:45)
Офлайн
vortex604Добавь сообщения, которые выводятся в журнал. Например, у тебя получилось подключиться и скачать данные - запиши это в журнал. Потом у тебя получилось разобрать данные - запиши это в журнал.
Попробовал добавить loguru, но файл все время пустой
Офлайн
Получилось отловить такое:
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='www.bigsquidrc.com', port=443): Max retries exceeded with url: /category/news/new-products/ (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000001F74E00E220>: Failed to establish a new connection: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера'))
Это сайт не доступен? Он понимает что его парсят и защиту включает?
Офлайн
vortex604ммм оно те место (site) это оно
Он понимает
Офлайн
vortex604Убедись сначала, что у тебя с интернетом всё в порядке. Запусти какой-нибудь скрипт параллельно с этим скриптом, чтобы он обращался к другому сайту таким же образом. И поставь логирование для каждой операции, которое пишет в файл на диске.
Это сайт не доступен? Он понимает что его парсят и защиту включает?
vortex604Они обычно ничего не включают, а покупают защиту у внешнего поставщика. Потестируй, есть ли там защита, сделав такой же скрипт, но который запускается раз в пять минут, и пусть он соединяется с сайтом там раз десять или двадцать. Если соединяется, то нет там защиты.
Он понимает что его парсят и защиту включает?
Отредактировано py.user.next (Ноя. 19, 2022 23:59:46)
Офлайн
Почему не сработала такая конструкция?
Опять словил ошибку (в pycharm она показывается), а в логе не отразилось…
while True: try: page = requests.get(URL, headers=header) break except TimeoutError: logging.info("Нет коннекта")
Офлайн