Как скачать видео с Vimeo с помощью Python?
Table Of Content
- Немного предыстории
- Внимание!
- Настройка пустого проекта
- Теория
- Получение идентификатора видео
- установим целевой URL видео
- Получение конфигурации проекта в формате JSON
- устанавливаем URL конфигурации видео
- отправляем GET-запрос для получения JSON-конфигурации видео
- преобразуем JSON в объект
- проверяем результат
- Скачивание видео с Vimeo с помощью Python
- создаем переменную для конфигурации видео
- получаем URL-адрес видео
- подготавливаем имя файла для этого видео
- скачиваем видео
- открываем файл и записываем в него содержимое
- выводим результат
- Выбор качества
- целевая высота видео
- Заключение
Эта статья ориентирована на новичков. Я хочу научить вас немного о кодировании загрузчиков с видеохостингов. Конечно, вы можете использовать готовые библиотеки для решения этой задачи, что является идеальным решением. Однако, если вы предпочитаете научиться делать это самостоятельно, давайте вместе разберемся, как скачать видео с 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 нам нужен.
Давайте напишем код для загрузки конфигурации видео с 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-адреса видео различного качества.
Для начала проигнорируем выбор качества и просто скачаем первое доступное видео.
# создаем переменную для конфигурации видео
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.
Как видите, задача довольно проста, но если у вас все еще есть вопросы, дайте мне знать.
Также, пожалуйста, сообщите мне, если вы заметите какие-либо ошибки в моем коде или тексте. Английский не является моим родным языком, поэтому я могу допустить много опечаток, ошибок и т. д.
Не забудьте написать благодарный комментарий, если мой пост помог вам узнать что-то новое 🙂