【问题标题】:Search on YouTube and return all links in Python在 YouTube 上搜索并返回 Python 中的所有链接
【发布时间】:2019-06-30 06:20:20
【问题描述】:

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

这里出了什么问题?

【问题讨论】:

  • 错误是什么?
  • 您的代码看起来不错。错误是什么??
  • 搜索结果后才返回对吗?除此之外,你还想返回什么?我的意思是你的问题实际上是什么?你想做什么?
  • 各位,需求他已经说的很清楚了,答案已经到了。请再次阅读问题。

标签: python selenium youtube webdriver webdriverwait


【解决方案1】:

但最好使用显式等待:

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

Reference.

希望对你有帮助!

【讨论】:

    【解决方案2】:

    根据与@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://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
    

    【讨论】:

    • 但是输出中的第一个链接不是您在youtube上搜索python视频时获得的第一个视频..?这就是我想要的
    • @MarkWekking 您在寻找广告网址吗?
    • 不,我想要你在 youtube 上搜索 Python 时获得的视频链接列表,理论上第一个链接应该是:youtube.com/watch?v=rfscVS0vtbw。因为当您搜索 Python 视频时,它会返回第一个视频 (youtube.com/results?search_query=Python)
    • @MarkWekking 我发现了问题...您需要将--incognito 添加到chrome_options 我将其添加到我的答案中... :)
    • 这并不能解决我的问题 .. 我仍然会看到 youtube 主屏幕上的视频,而不是搜索词之后的视频
    【解决方案3】:

    要从搜索中返回关键字为 Python 的所有视频,您需要:

    • 最大化屏幕,以便在HTML DOM 中呈现所有生成的视频链接。
    • 在提取 href 属性之前,诱导 WebDriverWait 使所需的元素可见
    • 您可以使用以下解决方案

      • 代码块:

        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://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']
        

    【讨论】:

    • 最大化浏览器有什么关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2018-11-17
    • 2013-09-11
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多