Python Script для создания списка заголовков видео плейлиста YouTube, содержащего более 100 видео - PullRequest
0 голосов
/ 05 мая 2019

Я использую приведенный ниже код для создания списка, содержащего заголовки видео в общедоступном плейлисте 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 ]

2 голосов
/ 05 мая 2019

Как вы видели правильно, загружаются только первые 100 видео.Когда пользователь прокручивает вниз ajax, звонки выполняются для загрузки дополнительных видео.

Самым простым, но в то же время наиболее тяжелым вариантом воспроизведения ajax-вызовов является использование selenium webdriver .Вы можете найти официальную документацию Python здесь .

0 голосов
/ 05 мая 2019

Я создал следующий скрипт с помощью входных данных из Abrogans .

Также эта суть была полезна.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...