Найти - Пользователи
Полная версия: Работает час и вылетает... подскажите.
Начало » Python для новичков » Работает час и вылетает... подскажите.
1 2
Evgen777
Господа форумчане.
Посмотрите в чем проблема.
Написал небольшой парсер. Сайт динамический поэтому нужно на него заходить для получения информации.
Работает 1 час примерно и вылетает.

 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
options = Options()
options.headless = True
serials = 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/")
        if dostup.ok:
            with webdriver.Firefox(options=options) as driver:
                WebDriverWait(driver, 20)
                driver.get("https://lotoclub.kz/")
                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:
                    time.sleep(15)
                    driver.quit()
                    scaning()
                else:
                    send_telegram(datas2.text)
                    print(datas2.text)
                    time.sleep(20)
                    driver.quit()
                    serials = numb
        else:
            driver.quit()
            scaning()
scaning()

Задача у кода такая.
Зайти на сайт проверить если номер серии поменялся (номер розыгрыша) тогда отправить в телегу выпавшее число.
Сайт который отслеживаю - розыгрыш лото. Проходит примерно каждую минуту - полторы.
Поэтому нужно довольно часто обращаться к сайту.
FishHook
Evgen777
У вас в функции бесконечная рекурсия. Каждый вложенный вызов функции создает новый фрейм на стеке, рано или поздно стек заканчивается - это знаменитый стековерфло. Почитайте про то, как работают функции, гуглить по словам “стек вызовов”
FishHook
Evgen777
вам надо:
1. вынести цикл во вне функции
либо
2. использовать какой-либо шедуллер

Evgen777
FishHook
шедуллер
Спасибо Вам большое за подсказку. Шедуллер наверное самое ОНО!
Да и на будущее расширяет кругозор.
Спасибо еще раз.
ntram
VANISHED
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():
    global serials
    dostup = requests.get("https://lotoclub.kz/")
    with suppress(Exception):
        with webdriver.Firefox(options=options) as driver:
            WebDriverWait(driver, 20)
            time.sleep(1)
            driver.get("https://lotoclub.kz/")
            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
schedule.every(1).minutes.do(scaning)
while True:
    schedule.run_pending()
    time.sleep(1)
ZerG
Запустите скрипт и отключите сеть. Остановится сразу?
Evgen777
ZerG
Запустите скрипт и отключите сеть. Остановится сразу?
Да выдало ошибку
 conn = connection.create_connection(
ntram
VANISHED
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