Sur YouTube, je souhaite rechercher certaines vidéos (par exemple, des vidéos sur Python) et après cela, je souhaite renvoyer toutes les vidéos renvoyées par cette recherche. En ce moment, si j'essaye ce Python renvoie toutes les vidéos de la page de démarrage et non de la page après la recherche.
Code actuel:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get("http://youtube.com") driver.find_element_by_name("search_query").send_keys("Python") driver.find_element_by_id("search-icon-legacy").click() links = driver.find_elements_by_id("video-title") for x in links: print(x.get_attribute("href"))
Qu'est-ce qui ne va pas ici?
3 Réponses :
Mais il vaut mieux utiliser une attente explicite pour cela:
links = ui.WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.ID, "video-title")))
J'espère que cela vous aidera!
Selon la discussion avec @Mark:
Il semble que les éléments de la première page de Youtube soient toujours dans le DOM ...
Le seul correctif que je vois est d'aller dans le URL de recherche:
https://www.youtube.com/watch?v=rfscVS0vtbw https://www.youtube.com/watch?v=f79MRyMsjrQ https://www.youtube.com/watch?v=kLZuut1fYzQ https://www.youtube.com/watch?v=N4mEzFDjqtA https://www.youtube.com/watch?v=Z1Yd7upQsXY https://www.youtube.com/watch?v=hnDU1G9hWqU https://www.youtube.com/watch?v=3cZsjOclmoM https://www.youtube.com/watch?v=f3EbDbm8XqY https://www.youtube.com/watch?v=2uCXIbkbDSE https://www.youtube.com/watch?v=HXV3zeQKqGY https://www.youtube.com/watch?v=JJmcL1N2KQs https://www.youtube.com/watch?v=qiSCMNBIP2g https://www.youtube.com/watch?v=7lmCu8wz8ro https://www.youtube.com/watch?v=25ovCm9jKfA https://www.youtube.com/watch?v=q6Mc_sAPZ2Y https://www.youtube.com/watch?v=yE9v9rt6ziw https://www.youtube.com/watch?v=Y8Tko2YC5hA https://www.youtube.com/watch?v=G0rQ7AEl5LA https://www.youtube.com/watch?v=CtbckFw0pJs https://www.youtube.com/watch?v=sugvnHA7ElY
Vous devez utiliser WebDriverWait not sleep:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.chrome.options import Options opt = Options() opt.add_argument("--incognito") driver = webdriver.Chrome(executable_path=r'C:\path\to\chromedriver.exe', chrome_options=opt) driver.get("http://youtube.com") driver.find_element_by_name("search_query").send_keys("Python") driver.find_element_by_id("search-icon-legacy").click() WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.ID, "video-title"))) links = driver.find_elements_by_id("video-title") for x in links: print(x.get_attribute("href"))
Le résultat:
driver.get("http://youtube.com/results?search_query=Python") # driver.find_element_by_name("search_query").send_keys("Python") # driver.find_element_by_id("search-icon-legacy").click()
Mais le premier lien dans la sortie n'est pas la première vidéo que vous obtenez lorsque vous recherchez des vidéos python sur youtube ..? C'est ce que je veux
@MarkWekking recherchez-vous l'URL de l'annonce?
Non, je veux la liste des liens vers les vidéos que vous obtenez lorsque vous recherchez Python sur youtube, en théorie le premier lien devrait être: youtube.com/watch?v=rfscVS0vtbw . car lorsque vous recherchez des vidéos Python, c'est la première vidéo qu'elle renvoie ( youtube.com/results?search_query = Python )
@MarkWekking J'ai trouvé le problème ... vous devez ajouter --incognito
à chrome_options
Je l'ajouterai à ma réponse ... :)
Cela ne résout pas le problème pour moi. Je reçois toujours les vidéos qui se trouvent sur l'écran d'accueil de YouTube et non celles qui suivent le terme de recherche
Continuons cette discussion dans le chat .
Pour renvoyer toutes les vidéos de la recherche avec le mot clé Python , vous devez:
Vous pouvez utiliser la solution suivante
Bloc de code:
['https://www.youtube.com/watch?v=rfscVS0vtbw', 'https://www.youtube.com/watch?v=7UeRnuGo-pg', 'https://www.youtube.com/watch?v=3cZsjOclmoM', 'https://www.youtube.com/watch?v=f79MRyMsjrQ', 'https://www.youtube.com/watch?v=CtbckFw0pJs', 'https://www.youtube.com/watch?v=Z1Yd7upQsXY', 'https://www.youtube.com/watch?v=kLZuut1fYzQ', 'https://www.youtube.com/watch?v=IZ0IM_T4aio', 'https://www.youtube.com/watch?v=qiSCMNBIP2g', 'https://www.youtube.com/watch?v=N0lxfilGfak', 'https://www.youtube.com/watch?v=N4mEzFDjqtA', 'https://www.youtube.com/watch?v=s3Ejdx6cIho', 'https://www.youtube.com/watch?v=Y8Tko2YC5hA', 'https://www.youtube.com/watch?v=c3FXQU3TyCU', 'https://www.youtube.com/watch?v=yE9v9rt6ziw', 'https://www.youtube.com/watch?v=yvHrNlAF0Y0', 'https://www.youtube.com/watch?v=ZDa-Z5JzLYM']
Sortie de la console:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC options = webdriver.ChromeOptions() options.add_argument("start-maximized") options.add_argument("disable-infobars") options.add_argument("--disable-extensions") driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe') driver.get("https://www.youtube.com/") WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#search"))).send_keys("Python") driver.find_element_by_css_selector("button.style-scope.ytd-searchbox#search-icon-legacy").click() print([my_href.get_attribute("href") for my_href in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "a.yt-simple-endpoint.style-scope.ytd-video-renderer#video-title")))])
comment maximiser le navigateur a quelque chose à voir avec cela?
quelle est l'erreur?
Votre code semble correct, quelle est l'erreur ??
Il revient après les résultats de la recherche, n'est-ce pas? Que voulez-vous revenir en dehors de cela? Je veux dire quelle est votre question en fait? Qu'est-ce que tu veux faire?
Les gars, il a clairement mentionné l'exigence et les réponses sont déjà arrivées. Veuillez relire la question.