Парсинг метаданных видео на YouTube с использованием библиотек Requests и Json только
Table Of Content
В этом посте мы рассмотрим парсинг метаданных любого видео на YouTube для получения информации о просмотрах, лайках, дизлайках, дате публикации и т.д. с использованием Python. Мы не будем использовать сторонние библиотеки, которые парсят HTML, такие как Beautiful Soup.
Постановка задачи:
Получить метаданные видео на YouTube, такие как количество просмотров, количество лайков/дизлайков, дата публикации, заголовок видео и т.д., без использования сторонних библиотек, которые парсят HTML или JavaScript. Кроме того, мы не будем использовать YouTube API для получения данных.
Подход
Существует несколько способов получить данные с Youtube или любого другого веб-сайта. Чтобы разобрать веб-сайт, можно использовать библиотеку Beautiful Soup. Но мы воспользуемся еще более простым способом, чтобы получить необходимый набор данных.
Мы будем использовать библиотеку python requests для получения исходного кода страницы с ссылкой на видео Youtube и библиотеку json для разбора текста в объект Json.
У страницы Youtube есть определенная структура. Когда вы открываете исходный код страницы, ищите «ytInitialData», и вы увидите, что в теге script этой переменной присваивается json. Единственная проблема в том, что мы не можем использовать его как есть, и нам нужно немного его обработать. Так что в основном мы будем обрабатывать строки в Python, чтобы получить нужные данные.
Чтобы получить точный Json, мне нужно найти начальный и конечный индексы этого Json в исходном коде страницы. Но прежде чем перейти к разделу с кодом, попробуйте сделать это самостоятельно для любого видео Youtube, которое вы смотрите.
1. Чтобы получить исходный код страницы любого веб-сайта, вы можете щелкнуть правой кнопкой мыши на веб-сайте и выбрать опцию View Page Source.
2. Ищите ytInitialData на вкладке, где открыт исходный код страницы. Фактическая строка будет выглядеть примерно так:
Код
Давайте напишем его на Python пошагово:
В качестве предварительного шага вам нужно импортировать библиотеки json и requests.
import json
import requests
def import_video_data(URL):
print('Получение исходного кода страницы видео по URL ' + URL)
# window["ytInitialData"] =
page_source = requests.get(URL)
page_source = page_source.text
- Извлеките данные json из исходного кода страницы данной ссылки на видео.
start_index = page_source.find('ytInitialData')
tmp = page_source[ start_index+17:]
end_index = tmp.find('}};')
tmp = tmp[:end_index] + '}}'
return tmp
- Теперь разберите возвращенную строку Json в виде объекта Json с помощью библиотеки Json. Здесь мы используем метод loads() для преобразования строки Json в словарь.
def parse_json(json_data):
json_dict = json.loads(json_data)
return json_dict
Json, который мы получили на предыдущем шаге, будет выглядеть примерно так:
<Image
src="/blogs/4df3705ef1.jpg"
width="700"
height="548"
alt=""
sizes="100vw"
/>
- Из Json теперь мы можем извлечь любую информацию, которую хотим. Здесь показан базовый ручной способ получения заголовка, идентификатора видео, количества просмотров, лайков, дизлайков, их сокращенной формы и даты публикации:
Для идентификатора видео:
video_id = yt_json['currentVideoEndpoint']['watchEndpoint']['videoId']
print('Идентификатор видео: ' + video_id)
Для заголовка:
title = \
yt_json['contents']['twoColumnWatchNextResults']['results']['results']['contents'][0]['videoPrimaryInfoRenderer'][
'title']['runs'][0]['text']
print('Заголовок: ' + title)
Для количества просмотров и его сокращенной формы:
views = \
yt_json['contents']['twoColumnWatchNextResults']['results']['results']['contents'][0]['videoPrimaryInfoRenderer'][
'viewCount']['videoViewCountRenderer']['viewCount']['simpleText']
short_views = \
yt_json['contents']['twoColumnWatchNextResults']['results']['results']['contents'][0]['videoPrimaryInfoRenderer'][
'viewCount']['videoViewCountRenderer']['shortViewCount']['simpleText']
print('Просмотры: ' + views + ' в сокращенной форме: ' + short_views)
Для лайков и их сокращенной формы:
likes = \
yt_json['contents']['twoColumnWatchNextResults']['results']['results']['contents'][0]['videoPrimaryInfoRenderer'][
'videoActions']['menuRenderer']['topLevelButtons'][0]['toggleButtonRenderer']['defaultText']['accessibility'][
'accessibilityData']['label']
likes_inshort = \
yt_json['contents']['twoColumnWatchNextResults']['results']['results']['contents'][0]['videoPrimaryInfoRenderer'][
'videoActions']['menuRenderer']['topLevelButtons'][0]['toggleButtonRenderer']['defaultText']['simpleText']
print('Лайки: ' + likes + ' в сокращенной форме: ' + likes_inshort)
Для дизлайков и их сокращенной формы:
dislikes = \
yt_json['contents']['twoColumnWatchNextResults']['results']['results']['contents'][0]['videoPrimaryInfoRenderer'][
'videoActions']['menuRenderer']['topLevelButtons'][1]['toggleButtonRenderer']['defaultText']['accessibility'][
'accessibilityData']['label']
dislikes_inshort = \
yt_json['contents']['twoColumnWatchNextResults']['results']['results']['contents'][0]['videoPrimaryInfoRenderer'][
'videoActions']['menuRenderer']['topLevelButtons'][1]['toggleButtonRenderer']['defaultText']['simpleText']
print('Дизлайки: ' + dislikes + ' в сокращенной форме: ' + dislikes_inshort)
Для даты публикации:
published_date = \
yt_json['contents']['twoColumnWatchNextResults']['results']['results']['contents'][0]['videoPrimaryInfoRenderer'][
'dateText']['simpleText']
print('Дата публикации: ' + published_date)
Вывод вышеприведенного кода будет выглядеть следующим образом:
Получение исходного кода страницы видео по URL https://www.youtube.com/watch?v=JRtgXN-bwGE
Идентификатор видео: JRtgXN-bwGE
Заголовок: Honest Review | Raat Akeli Hai, Shakuntala Devi & Lootcase | MensXP
Просмотры: 282,420 просмотров в сокращенной форме: 282K просмотров
Лайки: 21,343 лайков в сокращенной форме: 21K
Дизлайки: 413 дизлайков в сокращенной форме: 413
Дата публикации: 1 Aug 2020
Используя указанную выше технику, у вас будет Json, и вы сможете извлекать любые данные, которые вам нужны. Вы можете найти весь этот код в моем репозитории на Github.
Если у вас есть какие-либо предложения или отзывы, дайте мне знать в комментариях ниже.