Я сделал загрузчик аудио / видео с 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