APScheduler и передача аргументов

Я использую APScheduler для автоматизации моего скрипта каждые 10 минут. Перестает выполняться после print("[+] Success! Bot Starting!"), ошибку не выдает. Я полагаю, что мое объявление scheduler.add_job(trendingBot, 'interval', минуты=10, args=[url, browser]) неверно, и я не знаю, как это исправить.

# grabs all the trending quotes for that day
def getTrendingQuotes(browser):
    # wait until trending links appear, not really needed only for example
    all_trendingQuotes = WebDriverWait(browser, 10).until(
        lambda d: d.find_elements_by_css_selector('#trendingQuotes a')
    )
    return [link.get_attribute('href') for link in all_trendingQuotes]


def getStockDetails(url, browser):

    print(url)
    browser.get(url)

    quote_wrapper = browser.find_element_by_css_selector('div.quote-wrapper')
    quote_name = quote_wrapper.find_element_by_class_name(
        "quote-name").find_element_by_tag_name('h2').text
    quote_price = quote_wrapper.find_element_by_class_name("quote-price").text
    quote_volume = quote_wrapper.find_element_by_class_name(
        "quote-volume").text

    print("\n")
    print("Quote Name: " + quote_name)
    print("Quote Price: " + quote_price)
    print("Quote Volume: " + quote_volume)
    print("\n")

    convertToJson(quote_name, quote_price, quote_volume, url)


quotesArr = []

# Convert to a JSON  file


def convertToJson(quote_name, quote_price, quote_volume, url):
    quoteObject = {
        "url": url,
        "Name": quote_name,
        "Price": quote_price,
        "Volume": quote_volume
    }
    quotesArr.append(quoteObject)


def trendingBot(url, browser):
    browser.get(url)
    trending = getTrendingQuotes(browser)
    for trend in trending:
        getStockDetails(trend, browser)
    # requests finished, write json to file
    with open('trendingQuoteData.json', 'w') as outfile:
        json.dump(quotesArr, outfile)


def Main():
    scheduler = BlockingScheduler()
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    # applicable to windows os only
    chrome_options.add_argument('--disable-gpu')

    url = 'https://www.tmxmoney.com/en/index.html'
    browser = webdriver.Chrome(
        r"C:\Users\austi\OneDrive\Desktop\chromeDriver\chromedriver_win32\chromedriver.exe", chrome_options=chrome_options)
    browser.get(url)

    os.system('cls')
    print("[+] Success! Bot Starting!")
    scheduler.add_job(trendingBot, 'interval', minutes=1, args=[url, browser])
    scheduler.start()
    #trendingBot(url, browser)
    browser.quit()


if __name__ == "__main__":
    Main()

person pennyBoy    schedule 10.12.2018    source источник


Ответы (1)


APScheduler по умолчанию неблокирует, что означает, что когда вы выполняете scheduler.add_job(.. и scheduler.start(), ваше приложение продолжает работать до browser.quit() и, наконец, до конца вашего приложения (где оно завершается).

Кажется, вам нужен блокирующий планировщик, такой как Планировщик блокировки.

Измените строку:

scheduler = BackgroundScheduler()

to

scheduler = BlockingScheduler()
person Conner    schedule 10.12.2018
comment
Хром-браузер имеет много сообщений, блокирующих Parser, это нормально? Загромождает весь экран. Кстати. Я думаю, что это работает, но это движется немного медленно. Я также обновил пост с моей полной реализацией. - person pennyBoy; 11.12.2018