CoderCastrov logo
CoderCastrov
Программирование

Как скачать видео с Vimeo с помощью Python?

Как скачать видео с Vimeo с помощью Python?
просмотров
6 мин чтение
#Программирование

Эта статья ориентирована на новичков. Я хочу научить вас немного о кодировании загрузчиков с видеохостингов. Конечно, вы можете использовать готовые библиотеки для решения этой задачи, что является идеальным решением. Однако, если вы предпочитаете научиться делать это самостоятельно, давайте вместе разберемся, как скачать видео с Vimeo с помощью Python!

Немного предыстории

В моем последнем проекте я написал код для загрузки видео с Vimeo на JavaScript, потому что весь проект был основан на NodeJS. Но я считаю, что Python - более читабельный язык для изучения чего-либо. Так что, в некотором смысле, я буду кодировать этот небольшой инструмент вместе с вами. В общем, не имеет значения, на каком языке это делать.

Кстати, я написал статью о том, как защитить контент от скраперов. Посмотрите ее, если вас интересует скрапинг, JavaScript и т.д.

Так что, я мог бы назвать эту статью "Как скачать видео с Vimeo с помощью NodeJS" или что-то в этом роде. В общем, это не имеет значения.

Я разделю статью на логические части, чтобы чтение было более комфортным. Давайте двигаться дальше.

Внимание!

Я создал этот пост и этот код в образовательных целях. Я не рекомендую его использовать в коммерческих целях. Я не несу ответственности за любой ущерб, причиненный этим кодом. Пожалуйста, не используйте этот код незаконно и избегайте незаконных действий.

Настройка пустого проекта

Эта часть не связана с темой статьи. В общем, вам просто нужно создать файл main.py и использовать установленный локально Python. Я планирую использовать версию 3.10, но, полагаю, что мой код будет работать хорошо в версиях, таких как 3.9, 3.7 и т.д.

Теория

Когда вы смотрите видео в браузере, все происходит автоматически. Браузер выполняет код страницы и начинает загружать видео. Когда есть достаточно данных для отображения видео, вы можете нажать кнопку воспроизведения, и браузер начнет воспроизводить видео.

Нам нужно сделать то же самое. Я имею в виду найти URL-адрес файла видео, а затем загрузить его.

Получение идентификатора видео

Давайте возьмем в качестве примера некоторое видео. Я случайно выбрал это видео. Оно выглядит странно, но нам не нужно обращать внимание на его содержимое.

Наша первая цель - получить идентификатор видео. Эти числа в конце URL видео являются его идентификатором. Итак, давайте спарсим их и сохраним в отдельные переменные.

# установим целевой URL видео
target_video_url = '[https://vimeo.com/712159936'](https://vimeo.com/712159936')# удалим слэш с конца URL
if target_video_url[-1] == '/':
    target_video_url = target_video_url[:-1]# получим идентификатор видео из URL
video_id = target_video_url.split('/')[-1]# проверим результат
print(video_id)

Позвольте мне объяснить немного. Чтобы получить идентификатор видео, мы использовали функцию split. Эта функция создает массив из строки, разделяя ее по определенному символу. Чтобы убедиться, что в конце URL нет слэша, я добавил еще одну проверку. Если мы уберем эту проверку и используем функцию split, то результат будет отличаться.

Получение конфигурации проекта в формате JSON

Какой следующий шаг? Я покажу вам немного. Откройте веб-сайт Vimeo, а затем откройте инспектор веб-страниц в вашем браузере. Я использую Safari, поэтому для меня это сочетание клавиш Option + CMD + I. Откройте вкладку "Network" и выберите XHR/Fetch или что-то подобное. Эта вкладка показывает все запросы, которые браузер отправляет для этой страницы. Теперь перезагрузите страницу и получите результаты.

Вы должны увидеть запрос с названием "config". Вот то, что мы ищем.

Информация о запросе конфигурации видео

Сервер отвечает данными в формате JSON. И эти данные JSON содержат реальный URL для видеофайлов. Знаете ли вы, что это означает? Я хочу сказать, что если мы получим реальный URL видео, то мы сможем легко его скачать. Вот почему нам нужно получить конфигурацию проекта, чтобы скачать видео с Vimeo с помощью Python.

Если вы откроете вкладку "Headers" (которая может отличаться в вашем браузере) для этого запроса, вы увидите, какой тип запроса (GET) и какой URL нам нужен.

Целевой URL для загрузки видео с Vimeo с помощью Python

Давайте напишем код для загрузки конфигурации видео с Vimeo. Я хотел бы использовать библиотеку requests. Вы можете установить ее с помощью pip командой: pip install requests.

# устанавливаем URL конфигурации видео
video_config_url = '[https://player.vimeo.com/video/'](https://player.vimeo.com/video/') + video_id + '/config'
# отправляем GET-запрос для получения JSON-конфигурации видео
video_config_response = requests.get(video_config_url)
# преобразуем JSON в объект
video_config_json = video_config_response.json()
# проверяем результат
print(video_config_json)

Я запустил этот код и получил следующий результат. Похоже, все работает нормально.

Результат выполнения кода

Скачивание видео с Vimeo с помощью Python

Мы заинтересованы в поле video_config_json['request']['files']['progressive']. Оно содержит URL-адреса видео различного качества.

Target field inside video config dictionary

Для начала проигнорируем выбор качества и просто скачаем первое доступное видео.

# создаем переменную для конфигурации видео
video_config = video_config_json['request']['files']['progressive'][0]
# получаем URL-адрес видео
video_url = video_config['url']
# подготавливаем имя файла для этого видео
video_name = video_id + '_' + video_config['quality'] + '.mp4'
# скачиваем видео
video_response = requests.get(video_url)
# открываем файл и записываем в него содержимое
video_file = open(video_name, 'wb')
video_file.write(video_response.content)
video_file.close()
# выводим результат
print('скачано: ' + video_name)

Это работает! Вы можете проверить это самостоятельно.

Выбор качества

Хорошо, а что если мне нужно определенное качество видео? Давайте сделаем выбор качества. Например, скажем, что нам нужно видео Vimeo с высотой около 480 пикселей. Обычно можно услышать "видео с качеством 480p". Возможно, вы видели поля "ширина" и "высота". Таким образом, вы можете просто сравнить качество видео и выбрать нужное. Однако, что делать, если нужного качества нет?

Давайте напишем код, чтобы выбрать видео с наиболее близкой высотой к нашей цели.

# целевая высота видео
target_video_height = 480# конфигурация видео
target_video_config = None# проверяем все видео и находим наиболее близкое
for video_config in video_config_json['request']['files']['progressive']:
    
    # пропускаем первое видео
    if (target_video_config is None):
        target_video_config = video_config
        continue
        
    # получаем высоту видео
    video_height = video_config['height']# проверяем высоту видео
    video_height_diff = abs(target_video_height - video_height)
    target_video_height_diff = abs(target_video_height - target_video_config['height'])
    
    # проверяем разницу в высоте видео
    if video_height_diff < target_video_height_diff:
        target_video_config = video_config

Возможно, код выглядит длинным, но он довольно простой. Мы проходимся в цикле для каждой конфигурации видео. Если целевая конфигурация видео равна None, то мы просто устанавливаем target_video_config в текущую конфигурацию видео. Таким образом, первая итерация всегда одинаковая.

На следующей итерации цикла мы вычисляем разницу в пикселях между целевой высотой видео и нашими результатами. Функция abs используется для того, чтобы числа всегда были положительными.

Если текущая разница в высоте видео меньше целевой, она становится целевой.

После завершения цикла мы получаем наиболее близкую высоту видео к нашей цели.

Заключение

После того, как весь код был готов, я провел рефакторинг. Вы можете скачать код с моего GitHub.

Как видите, задача довольно проста, но если у вас все еще есть вопросы, дайте мне знать.

Также, пожалуйста, сообщите мне, если вы заметите какие-либо ошибки в моем коде или тексте. Английский не является моим родным языком, поэтому я могу допустить много опечаток, ошибок и т. д.

Не забудьте написать благодарный комментарий, если мой пост помог вам узнать что-то новое 🙂