Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2022 22:31:58

Evgen777
Зарегистрирован: 2022-06-20
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работает час и вылетает... подскажите.

ntram
Благодарю за напоминание!

Офлайн

#2 Июнь 23, 2022 10:59:44

Evgen777
Зарегистрирован: 2022-06-20
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работает час и вылетает... подскажите.

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

Офлайн

#3 Июнь 23, 2022 12:01:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Работает час и вылетает... подскажите.

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

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



Офлайн

#4 Июнь 23, 2022 19:55:49

Evgen777
Зарегистрирован: 2022-06-20
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работает час и вылетает... подскажите.

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

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

Офлайн

#5 Июнь 23, 2022 20:06:03

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Работает час и вылетает... подскажите.

1. Про память это вы сейчас ерунду сказали.
2. Это можно решить в один процесс. Но так как вы не можете ни отдебажить решение самостоятельно, ни скорее всего не знакомы с асинхронными фреймворками, я вам предложил самое простое и надёжное решение. Это на самом деле самый простой вариант и нифига сложного тут нет.
3. Питон может осилить, это вы не можете



Офлайн

#6 Июнь 23, 2022 22:53:37

Evgen777
Зарегистрирован: 2022-06-20
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работает час и вылетает... подскажите.

FishHook
1. Про память это вы сейчас ерунду сказали. 2. Это можно решить в один процесс. Но так как вы не можете ни отдебажить решение самостоятельно, ни скорее всего не знакомы с асинхронными фреймворками, я вам предложил самое простое и надёжное решение. Это на самом деле самый простой вариант и нифига сложного тут нет.3. Питон может осилить, это вы не можете


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

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

Спасибо за подсказку. Наверно сделал тоже, что Вы и советовали, но чуть проще. Так как нет жестких требований, если есть пропуски по причине интернета, это допустимо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version