Мой проект: Youtube видео и аудио загрузчик с селеном (python 3)

Я сделал загрузчик аудио / видео с YouTube с помощью python просто для практики, я не использую его для загрузки песен, защищенных авторскими правами.

У меня есть одна проблема: Я не могу понять, как правильно заставить селен ждать загрузки страницы и элемент виден. Я использую функцию wait_page_load () для ожидания 30 секунд, но иногда страница загружается примерно за 1 минуту, что приводит к исключению selenium.common.exceptions.NoSuchElementException или selenium.common.exceptions.ElementNotInteractableException. Если я поставлю тайм-аут более 30 секунд, это займет слишком много времени, когда у меня много ссылок для загрузки.

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
import selenium

fp = r'C:UsersusernameAppDataRoamingMozillaFirefoxProfilesdks82apf.Selenium_New'
path = "C:Program FilesMozilla Firefoxgeckodriver.exe"
mp3_link = "https://ytmp3.cc/en13/"
mp4_link = "https://www.y2mate.com/en19"
yt_list = []


def wait_page_load(timeout=3):
    try:
        element_present = ec.presence_of_element_located((By.ID, 'main'))
        WebDriverWait(browser, timeout).until(element_present)
    except TimeoutException:
        print("Timed out waiting for page to load")
    finally:
        print("Page loaded")


def list_all_links(f_type):
    print(f"Type 'stop' when you listed all your {f_type} (20 maximum).")
    for i in range(20):
        input2 = input(f"Insert {f_type} {i + 1} link: ")
        if 'stop' in input2.lower()[:10]:
            break
        elif 'youtube.com' in input2:
            yt_list.append(input2)
        else:
            print("Link does not include 'youtube.com'. Include it and try again.")
            continue


browser = webdriver.Firefox(executable_path=path, firefox_profile=fp)
browser.minimize_window()

while True:
    input1 = input("You want to download audio or video? (A/V) ")
    file_number = 0
    if input1.lower() == "a":
        list_all_links('audio')
        for yt_item in yt_list:
            file_number += 1
            browser.get(mp3_link)  # Opens the specified webpage
            browser.find_element_by_xpath('//*[@id="input"]').send_keys(yt_item)
            browser.find_element_by_xpath('//*[@id="submit"]').click()
            wait_page_load(30)
            browser.find_element_by_xpath('//*[@id="buttons"]/a[1]').click()
            print(f"Song {file_number} out of {len(yt_list)} downloaded.")
    elif input1.lower() == "v":
        list_all_links('video')
        for yt_item in yt_list:
            file_number += 1
            browser.get(mp4_link)  # Opens the specified webpage
            wait_page_load()
            browser.find_element_by_xpath('//*[@id="txt-url"]').send_keys(yt_item)
            browser.find_element_by_xpath('//*[@id="btn-submit"]').click()
            wait_page_load(10)
            browser.find_element_by_xpath('//*[@id="mp4"]/table/tbody/tr[1]/td[3]/a').click()
            wait_page_load(10)
            browser.find_element_by_xpath('//*[@id="process-result"]/div/a').click()
            print(f"Song {file_number} out of {len(yt_list)} downloaded.")
    else:
        print("Unrecognized command, try again.")
        continue
    browser.quit()
    print("Finished downloading.")
    yt_list.clear()
    break

0

Добавить комментарий

Ваш адрес email не будет опубликован.