Парсинг youtube для получения динамически загружаемого контента

Я пытаюсь очистить YouTube, но в большинстве случаев я это делаю, но он просто возвращает пустой результат. В этом фрагменте кода я пытаюсь получить список названий видео на странице. Но когда я запускаю его, я просто получаю пустой результат. Даже один заголовок не отображается в результате. Я искал вокруг, и некоторые результаты указывают на то, что это связано с динамической загрузкой контента веб-сайтом с помощью javascript. Так ли это? Как мне это решить? Можно ли обойтись без селена?

from bs4 import BeautifulSoup
import requests

source = requests.get('https://www.youtube.com/user/schafer5/videos').text

soup = BeautifulSoup(source, 'lxml')

title = soup.findAll('a', attrs={'class': "yt-simple-endpoint style-scope ytd-grid-video-renderer")

print(title)

person NoobLearner    schedule 21.05.2020    source источник


Ответы (2)


Можно ли обойтись без селена?

Часто у сервисов есть API, которые позволяют проще автоматизировать, чем парсить сайты, у Youtube есть API и есть готовые официальные библиотеки для разных языков, для Python есть google-api-python-client, для запуска вам потребуется ключ. Я предлагаю перейти по ссылке Краткое руководство по API данных YouTube, обратите внимание, что вы можете игнорировать OAuth 2.0 части, если вам нужен доступ только к общедоступным данным.

person Daweo    schedule 21.05.2020
comment
В следующий раз я обязательно попробую поискать любые API, если они доступны. Спасибо за предложение - person NoobLearner; 21.05.2020

Я полностью согласен с @Daweo, и это правильный способ очистить сайт, такой как Youtube. Но если вы хотите использовать BeautifulSoup и не получить пустой список в конце, ваш код следует изменить на следующий:

from bs4 import BeautifulSoup
import requests

source = requests.get('https://www.youtube.com/user/schafer5/videos').text
soup = BeautifulSoup(source, 'html.parser')
titles = [i.text for i in soup.findAll('a') if i.get('aria-describedby')]

print(titles)

Я также предлагаю вам использовать API.

person Azim Mazinani    schedule 21.05.2020