4
votes

Rechercher sur YouTube et renvoyer tous les liens en Python

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?


4 commentaires

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.


3 Réponses :


4
votes

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")))

Référence .

J'espère que cela vous aidera!


0 commentaires

3
votes

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()


6 commentaires

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 .



2
votes

Pour renvoyer toutes les vidéos de la recherche avec le mot clé Python , vous devez:

  • Agrandissez l'écran pour que tous les liens vidéo résultants soient affichés dans le HTML DOM .
  • Indiquez WebDriverWait pour que les éléments souhaités soient visibles avant d'extraire les attributs href .
  • 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")))])
      


1 commentaires

comment maximiser le navigateur a quelque chose à voir avec cela?