import os import sys import tarfile import time from pathlib import Path import wget from loguru import logger from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.firefox import options from selenium.webdriver.firefox.service import Service from selenium.webdriver.firefox.webdriver import WebDriver from settings import BASE_DIR, GECKO_DRIVER_VERSION logger.remove() logger.add(sink=sys.stdout, colorize=True, level='DEBUG', format="{time:DD.MM.YYYY HH:mm:ss} | {level} | " "{message}") def download_gecko_driver(): gecko_driver = f'https://github.com/mozilla/geckodriver/releases/download/v{GECKO_DRIVER_VERSION}/' \ f'geckodriver-v{GECKO_DRIVER_VERSION}-linux64.tar.gz' if not Path(f'{BASE_DIR}/geckodriver').exists(): logger.info(f'Downloading gecodriver v {GECKO_DRIVER_VERSION}...') geckodriver_file = wget.download(url=gecko_driver, out=BASE_DIR) with tarfile.open(geckodriver_file) as tar: tar.extractall(BASE_DIR) os.remove(f'{BASE_DIR}/geckodriver-v{GECKO_DRIVER_VERSION}-linux64.tar.gz') logger.info(f'\ngeckodriver has been downloaded to folder {BASE_DIR}') def configure_firefox_driver(private_window: bool = False) -> WebDriver: opt = options.Options() opt.headless = True opt.add_argument('-profile') opt.add_argument(f'{Path.home()}/snap/firefox/common/.mozilla/firefox') if private_window: opt.set_preference("browser.privatebrowsing.autostart", True) service = Service(executable_path=f'{BASE_DIR}/geckodriver') firefox_driver = webdriver.Firefox(service=service, options=opt) return firefox_driver def parse_site(driver: WebDriver) -> str: driver.get( 'https://yandex.ru/maps/213/moscow/stops/stop__9640740/?l=masstransit&ll=37.527754%2C55.823507&tab=overview&z=21' ) time.sleep(4) elements = driver.find_elements(by='class name', value='masstransit-vehicle-snippet-view') bus_300, bus_t19 = None, None bus_300_arrival, bus_t19_arrival = None, None for element in elements: try: bus_300 = element.find_element(by='css selector', value='[aria-label="300"]') bus_300_arrival = element.find_element(by='class name', value='masstransit-prognoses-view__title-text') except NoSuchElementException: pass try: bus_t19 = element.find_element(by='css selector', value='[aria-label="т19"]') bus_t19_arrival = element.find_element(by='class name', value='masstransit-prognoses-view__title-text') except NoSuchElementException: pass return ('Остановка Б. Академическая ул, д. 15 в сторону Москва Сити\n' f'Автобус {bus_300.text} - {bus_300_arrival.text}\nАвтобус {bus_t19.text} - {bus_t19_arrival.text}' )