如何使用 Python 中的 Selenium 在 Chrome 上向下滚动 Youtube 频道

How to Scroll Down Youtube Channel on Chrome with Selenium in Python

我正在尝试向下滚动 YouTube 频道的“视频”选项卡,以便获得指向该频道中所有视频的链接。我在 Python 3 中使用 Selenium 模块,使用 Google Chrome 作为浏览器。这是我的 class 中执行此部分的方法(这在我调用 self.driver.get(CHANNEL_URL))

后立即调用
def get_video_links(self):
    xpath = '/html/body/ytd-app/div/ytd-page-manager/ytd-browse/ytd-two-column-browse-results-renderer/div[1]/ytd-section-list-renderer/div[2]/ytd-item-section-renderer/div[3]/ytd-grid-renderer/div[1]/ytd-grid-video-renderer/div[1]/div[1]/div[1]/h3/a'
    elements = self.driver.find_elements_by_xpath(xpath)
    last_result = 0
    curr_result = len(elements)
    while curr_result != last_result:
        self.driver.find_element_by_tag_name('body').send_keys(Keys.END)
        self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(3)
        elements = self.driver.find_elements_by_xpath(xpath)
        last_result = curr_result
        curr_result = len(elements)
    video_links = [elem.get_attribute('href') for elem in elements]
    return video_links

目前有 returns 60 个网址,如果不滚动,我会得到 30 个网址。然而,我正在抓取的频道有大约 150 个视频。我已经成功地进行了手动滚动,所以我知道元素查找部分是有效的。我试过 this and this 但他们只给我 30 个网址,我没有看到浏览器上发生任何滚动。

您可以使用 JavaScript 在 selenium 中向下滚动。

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

摘自 selenium docs.

如果您只想下载某个频道制作的所有视频,youtube-dl 是更好的选择。

您只需从控制台 运行 youtube-dl 并添加您要下载的频道的频道 ID。

$ youtube-dl "[INSERT CHANNEL-ID]"

它也适用于播放列表和个人视频,甚至支持其他网站。

发生此问题的原因可能是在加载 60 个视频后,页面需要加载更多视频,因此无法 return 您的完整编号。频道的视频数。

你可以做一件事,在加载 60 个视频后你可以再次搜索视频 link。