Поиск на YouTube и возврат всех ссылок в Python

На YouTube я хочу найти определенные видео (например, видео на Python), и после этого я хочу вернуть все видео, которые возвращает этот поиск. Прямо сейчас, если я попробую, этот Python возвращает все видео на стартовой странице, а не на странице после поиска.

Текущий код:

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

Что здесь не так?

в чем ошибка?

Moshe Slavin 06.02.2019 11:24

Ваш код выглядит нормально. В чем ошибка??

KunduK 06.02.2019 11:30

Он возвращается только после результатов поиска, верно? Что еще вы хотите вернуть, кроме этого? Я имею в виду, каков ваш вопрос на самом деле? Что ты хочешь делать?

Ali 06.02.2019 11:32

Ребята, он четко упомянул требование, и ответы уже поступили. Пожалуйста, прочитайте вопрос еще раз.

Parthapratim Neog 06.02.2019 11:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
4
2 636
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Но для этого лучше использовать явное ожидание:

links = ui.WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.ID, "video-title")))

Ссылка.

Надеюсь, это поможет вам!

Согласно обсуждению с @Mark:

Кажется, что элементы первой страницы Youtube все еще находятся в DOM...

Единственное исправление, которое я вижу, это перейти к URL-адресу поиска:

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

Вы должны использовать WebDriverWait не спать:

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

Выход:

https://thewikihow.com/video_rfscVS0vtbw
https://thewikihow.com/video_f79MRyMsjrQ
https://thewikihow.com/video_kLZuut1fYzQ
https://thewikihow.com/video_N4mEzFDjqtA
https://thewikihow.com/video_Z1Yd7upQsXY
https://thewikihow.com/video_hnDU1G9hWqU
https://thewikihow.com/video_3cZsjOclmoM
https://thewikihow.com/video_f3EbDbm8XqY
https://thewikihow.com/video_2uCXIbkbDSE
https://thewikihow.com/video_HXV3zeQKqGY
https://thewikihow.com/video_JJmcL1N2KQs
https://thewikihow.com/video_qiSCMNBIP2g
https://thewikihow.com/video_7lmCu8wz8ro
https://thewikihow.com/video_25ovCm9jKfA
https://thewikihow.com/video_q6Mc_sAPZ2Y
https://thewikihow.com/video_yE9v9rt6ziw
https://thewikihow.com/video_Y8Tko2YC5hA
https://thewikihow.com/video_G0rQ7AEl5LA
https://thewikihow.com/video_CtbckFw0pJs
https://thewikihow.com/video_sugvnHA7ElY

Но первая ссылка в выводе — это не первое видео, которое вы получаете, когда ищете видео о питоне на YouTube..? это то, что я хочу

Mark Wekking 06.02.2019 13:57

@MarkWekking, вы ищете URL-адрес объявления?

Moshe Slavin 06.02.2019 14:01

Нет, мне нужен список ссылок на видео, которые вы получаете при поиске Python на YouTube, теоретически первая ссылка должна быть: youtube.com/watch?v=rfscVS0vtbw. потому что когда вы ищете видео Python, это первое видео, которое оно возвращает (youtube.com/results?search_query=Питон)

Mark Wekking 06.02.2019 14:04

@MarkWekking Я нашел проблему ... вам нужно добавить --incognito в chrome_options, я добавлю это в свой ответ ... :)

Moshe Slavin 06.02.2019 14:12

Это не решает проблему для меня .. Я по-прежнему получаю видео, которые находятся на главном экране YouTube, а не те, что после поискового запроса.

Mark Wekking 06.02.2019 14:21

Давайте продолжить обсуждение в чате.

Moshe Slavin 06.02.2019 14:21
Ответ принят как подходящий

Чтобы вернуть все видео из поиска по ключевому слову питон, вам необходимо:

  • Разверните экран, чтобы все результирующие ссылки на видео отображались в HTML DOM.
  • Вызовите WebDriverWait для желаемого элементы должны быть видны перед извлечением атрибутов href.
  • Вы можете использовать следующее решение

    • Блок кода:

      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")))])
      
    • Выход консоли:

      ['https://thewikihow.com/video_rfscVS0vtbw', 'https://thewikihow.com/video_7UeRnuGo-pg', 'https://thewikihow.com/video_3cZsjOclmoM', 'https://thewikihow.com/video_f79MRyMsjrQ', 'https://thewikihow.com/video_CtbckFw0pJs', 'https://thewikihow.com/video_Z1Yd7upQsXY', 'https://thewikihow.com/video_kLZuut1fYzQ', 'https://thewikihow.com/video_IZ0IM_T4aio', 'https://thewikihow.com/video_qiSCMNBIP2g', 'https://thewikihow.com/video_N0lxfilGfak', 'https://thewikihow.com/video_N4mEzFDjqtA', 'https://thewikihow.com/video_s3Ejdx6cIho', 'https://thewikihow.com/video_Y8Tko2YC5hA', 'https://thewikihow.com/video_c3FXQU3TyCU', 'https://thewikihow.com/video_yE9v9rt6ziw', 'https://thewikihow.com/video_yvHrNlAF0Y0', 'https://thewikihow.com/video_ZDa-Z5JzLYM']
      

какое отношение к этому имеет максимизация браузера?

Corey Goldberg 06.02.2019 15:42

Другие вопросы по теме