Как реализовать парсинг по времени?

Всем добрый день. Подскаите пожалуйста, вот есть парсер. Как сделать так, чтобы он работал каждые 2 часа? Программа запрашивает число (время) как часто нужно парсить сайт, и после этого она каждые (например юзер ввёл 3) 3 часа парсит этот сайт. Но чтобы она не останалвивалась, работала 24/7. Вот есть код, немного глупый, но он с фиксированным временем.

while True:
    if datetime.datetime.now().time().hour == 3 or 
    datetime.datetime.now().time().hour == 6 or 
    datetime.datetime.now().time().hour == 9 or 
    datetime.datetime.now().time().hour == 12 or 
    datetime.datetime.now().time().hour == 15 or 
    datetime.datetime.now().time().hour == 18 or 
    datetime.datetime.now().time().hour == 21 or 
    datetime.datetime.now().time().hour == 24:
        main()
    else:
        pass
    time.sleep(3600)

Подскажите, как такое осуществить? Заранее большое спасибо!


Ответы (1 шт):

Автор решения: Just_a_person8

Для таких целей вроде есть модуль schedule

Простой пример:

import datetime

import schedule

i = 1


def job():
    global i
    print(f"Запустился {i} раз")
    i += 1
    print(datetime.datetime.now())


schedule.every(5).seconds.do(job)

while True:
    schedule.run_pending()

Вывод:

Запустился 1 раз
2019-11-01 12:18:27.172611
Запустился 2 раз
2019-11-01 12:18:32.173117
Запустился 3 раз
2019-11-01 12:18:37.173148

Модуль можно настраивать достаточно гибко:

schedule.every(10).minutes.do(job)
#каждые 10 минут

schedule.every().hour.do(job)
# каждый час

schedule.every().day.at("10:30").do(job)
# каждый день в 10-30

schedule.every().monday.do(job)
# каждый понедельник

schedule.every(2).wednesday.at("13:15").do(job)
# Каждую вторую среду в 13-15

schedule.every().minute.at(":17").do(job)
# каждую минуту в 17 секунду

Кроме того, можно передавать параметры в ту функцию, которую мы хотим вызывать:

import schedule

i = 0


def greet(name):
    global i
    print('Hello', name)
    i += 1
    if i == 5:
        return schedule.CancelJob # Отменяем задачу после 5 запуска


schedule.every(1).to(3).seconds.do(greet, name='Yandex')
# Запускаем задачу в случайное время время от 1 до 3 секунд

while True:
    schedule.run_pending()
→ Ссылка