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

时间:2019-05-05 14:17:56

标签: python python-3.x web-scraping youtube

我正在使用下面提供的代码来创建一个列表,其中包含公共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'))

2 个答案:

答案 0 :(得分:2)

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

最简单,也是最繁重的复制ajax选项    呼叫是使用 Selenium Webdriver 。你可以找到官方    python文档here

答案 1 :(得分:0)

我在Abrogans的帮助下创建了以下脚本。

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