Python 用于创建包含 100 多个视频的 YouTube 播放列表的视频标题列表的脚本

Python Script to create a list of video titles of a YouTube playlist containing more than 100 videos

我正在使用下面提供的代码创建一个列表,其中包含 public YouTube 播放列表中的视频标题。它适用于包含少于 100 个视频的播放列表。对于包含超过 100 个视频的播放列表,播放列表中前 100 个视频的标题将被添加到列表中。我认为这种行为背后的原因是因为当我们在浏览器中加载同一页面时,会加载前 100 个视频。当您向下滚动页面时,将加载剩余的视频。有没有办法从播放列表中获取所有视频的标题?

from bs4 import BeautifulSoup as bs
import requests

url = "https://www.youtube.com/playlist?list=PLRdD1c6QbAqJn0606RlOR6T3yUqFWKwmX"
r = requests.get(url)
soup = bs(r.text,'html.parser')
res = soup.find_all('tr',{'class':'pl-video yt-uix-tile'})
titles = []
for video in res:
    titles.append(video.get('data-title'))

如您所见,仅加载了前 100 个视频。当用户向下滚动时,ajax calls 会加载其他视频。

重现 ajax 最简单但也是最重要的选项 调用是使用 selenium webdriver。你可以找官方 python 文档 here.

我借助 的输入创建了以下脚本。

另外 this gist 很有帮助。

from bs4 import BeautifulSoup as bs
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Firefox()
url = "https://www.youtube.com/playlist?list=PLRdD1c6QbAqJn0606RlOR6T3yUqFWKwmX"
driver.get(url)

elem = driver.find_element_by_tag_name('html')
elem.send_keys(Keys.END)
time.sleep(3)
elem.send_keys(Keys.END)

innerHTML = driver.execute_script("return document.body.innerHTML")

page_soup = bs(innerHTML, 'html.parser')
res = page_soup.find_all('span',{'class':'style-scope ytd-playlist-video-renderer'})

titles = []
for video in res:
    if video.get('title') != None:
        titles.append((video.get('title')))

driver.close()