Найти - Пользователи
Полная версия: Работает час и вылетает... подскажите.
Начало » Python для новичков » Работает час и вылетает... подскажите.
1 2
Evgen777
ntram
Благодарю за напоминание!
Evgen777
FishHook
Evgen777вам надо:1. вынести цикл во вне функциилибо2. использовать какой-либо шедуллер
Внес несколько изменений, добавил время ожидания ответа от сервера. Теперь он не вылетает, а просто останавливается. Работает, работает и просто останавливается. Не выдавая ошибок и т.д.

 from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import time
import requests
from selenium.webdriver.firefox.options import Options
import schedule
from contextlib import suppress
options = Options()
options.headless = True
serials = 0
OO = 0
def send_telegram(text: str):
    token = "5206239063:AAEHnaXjpFCeFB0FGRYNN0rQbQLR2MsGnsU"
    url = "https://api.telegram.org/bot"
    channel_id = "-1001418930581"
    url += token
    method = url + "/sendMessage"
    r = requests.post(method, data={
        "chat_id": channel_id,
        "text": text
    })
    if r.status_code != 200:
        raise Exception("post_text error")
def scaning():
    # running = True
    # while running:
    global serials
    dostup = requests.get("https://lotoclub.kz/")
    #with suppress(Exception):
    #if dostup.ok:
    try:
        with webdriver.Firefox(options=options) as driver:
            WebDriverWait(driver, 20)
            time.sleep(10)
            driver.get("https://lotoclub.kz/")
            time.sleep(10)
            datas = driver.find_element(By.CLASS_NAME, "gmcard__tirage-list-left")
            datas2 = driver.find_element(By.CLASS_NAME, "gmcard__tirage-list-num")
            numb = int(datas.text[2:9])
            if serials == numb:
                driver.quit()
            else:
                send_telegram(datas2.text)
                print(datas2.text)
                driver.quit()
                serials = numb
    except:
        print("Повторное соединение")
        pass
schedule.every(1).minutes.do(scaning)
while True:
    schedule.run_pending()
    time.sleep(1)
    # print(OO + 1)
    # OO = OO + 1
FishHook
Evgen777
пересмотрите свой подход к этой программе полностью. Напишите на питоне два скрипта
первый: запускается, получает данные с lotoclub.kz/, парсит их, при этом логирует в файл важные этапы своего исполнения, сохраняет результат в SQLite и прекращает свою работу
второй: запускается, проверяет есть ли новые результаты парсинга в SQLite, если там ничего нет - завершает работу, если данные есть он их извлекает, подготавливает и отправляет в телеграмм и завершает работу. При этом он, конечно, тоже логирует в файл

затем есть два варианта
первый: вы средствами ОС, например с помощью cron задаете расписание запуска обоих скриптов, скажем раз в минуту
второй: вы пишите программу-таймер, которая в цикле запускает оба скрипта как отдельный процесс с помощью Popen. Она тоже логирует, что и в какой момент она запускает.

Evgen777
FishHook
Evgen777пересмотрите свой подход к этой программе полностью. Напишите на питоне два скриптапервый: запускается, получает данные с lotoclub.kz/, парсит их, при этом логирует в файл важные этапы своего исполнения, сохраняет результат в SQLite и прекращает свою работувторой: запускается, проверяет есть ли новые результаты парсинга в SQLite, если там ничего нет - завершает работу, если данные есть он их извлекает, подготавливает и отправляет в телеграмм и завершает работу. При этом он, конечно, тоже логирует в файлзатем есть два вариантапервый: вы средствами ОС, например с помощью cron задаете расписание запуска обоих скриптов, скажем раз в минутувторой: вы пишите программу-таймер, которая в цикле запускает оба скрипта как отдельный процесс с помощью Popen. Она тоже логирует, что и в какой момент она запускает.

Благодарю Вас за совет, но как то хотелось бы исключить столь сложные манипуляции для такой простой задачи.
Ранее данное решение было реализовано на JS с применением браузерного “проигрывателя” Tampermonkey.
Я думал, что Питон может осилить данную задачу и применение сторонних скриптов не потребуется.
Так как это только добавит расход памяти.
FishHook
1. Про память это вы сейчас ерунду сказали.
2. Это можно решить в один процесс. Но так как вы не можете ни отдебажить решение самостоятельно, ни скорее всего не знакомы с асинхронными фреймворками, я вам предложил самое простое и надёжное решение. Это на самом деле самый простой вариант и нифига сложного тут нет.
3. Питон может осилить, это вы не можете
Evgen777
FishHook
1. Про память это вы сейчас ерунду сказали. 2. Это можно решить в один процесс. Но так как вы не можете ни отдебажить решение самостоятельно, ни скорее всего не знакомы с асинхронными фреймворками, я вам предложил самое простое и надёжное решение. Это на самом деле самый простой вариант и нифига сложного тут нет.3. Питон может осилить, это вы не можете


Сейчас сделал так:
создал 2 файла
1. Таймер + запуск 2 скрипта
2. Скрипт парсера + чтение и запись в файл номера (проверка на повторение)

Таким образом мне кажется я игнорирую ошибки соединения. Сейчас был момент, второй скрипт запустился, но страница не загрузилась.
Файл не выдал ошибку, а просто закрылся и пошел дальше.
Поставлю тестироваться, пусть работает, проверим. Надеюсь это решит вопрос.
Данные храню просто в текстовом файле, я имею ввиду номер тиража. Так как хранить его ненужно, проверил и перезаписал.

Спасибо за подсказку. Наверно сделал тоже, что Вы и советовали, но чуть проще. Так как нет жестких требований, если есть пропуски по причине интернета, это допустимо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB