Как скачать встроенные видео
Table Of Content
При путешествии по всемирной паутине многие пользователи натыкаются на страницы, содержащие встроенные видео с YouTube или Vimeo. youtube-dl - это известный инструмент для загрузки онлайн-видео с многих источников (не ограничиваясь только YouTube - см. полный список поддерживаемых сайтов), но может ли он загружать видео, даже если они встроены на стороннем веб-сайте?
Оказывается, может (с небольшой помощью от пользователя). Позвольте мне показать, как это сделать.
В качестве первого примера рассмотрим страницу презентации Funnelscripts. Независимо от того, когда вы откроете страницу, вы увидите отсчет последних нескольких минут до начала презентации. Глобальный рынок никогда не спит. То же самое относится и к Расселу Бронсону и его пожилому другу. Независимо от даты и времени, они готовы провести вебинар о своем продукте SaaS.
Или это действительно так? Давайте зарегистрируемся на вебинаре и попробуем проникнуть за фасад. Через несколько минут мы сможем увидеть то, что кажется потоком вебинара.
Однако, открыв инструменты разработчика Chrome и немного изучив DOM, мы быстро обнаружим, что iframe с плеером Vimeo встроен и воспроизводит предзаписанное видео.
Подавая URL из атрибута src
в youtube-dl, мы можем загрузить всё видео:
$ youtube-dl "https://player.vimeo.com/video/401113675?muted=1&autoplay=1&&title=0&byline=0&wmode=transparent&autopause=0"
[vimeo] 401113675: Загрузка веб-страницы
[vimeo] 401113675: Загрузка информации об akfire_interconnect_quic m3u8
[vimeo] 401113675: Загрузка информации об akfire_interconnect_quic m3u8
[vimeo] 401113675: Загрузка информации о fastly_skyfire m3u8
[vimeo] 401113675: Загрузка информации о fastly_skyfire m3u8
[vimeo] 401113675: Загрузка информации об akfire_interconnect_quic MPD
[vimeo] 401113675: Загрузка информации об akfire_interconnect_quic MPD
[vimeo] 401113675: Загрузка информации о fastly_skyfire MPD
[vimeo] 401113675: Загрузка информации о fastly_skyfire MPD
[hlsnative] Загрузка манифеста m3u8
[hlsnative] Всего фрагментов: 1275
[download] Назначение: WEBINAR - NO ENCORE-401113675.fhls-fastly_skyfire_sep-2762.mp4
Однако, возможно, вам захочется загрузить несколько встроенных видео. Второй пример - страница курса Drop Service Mafia. Здесь есть несколько видео с YouTube, которые мы можем загрузить, чтобы посмотреть их во время межконтинентального полета, который люди совершат, когда Бали, наконец, откроется снова.
Первое видео - это файл MP4, встроенный с помощью тега <video>
, и его можно загрузить с помощью curl или wget.
Аналогично предыдущему примеру, у нас есть видео с YouTube, встроенные в HTML-код страницы.
Мы могли бы загрузить их по одному, но давайте будем умнее. Давайте напишем небольшой скрипт на Python, который будет парсить URL-адреса YouTube встроенных видео, а затем позволит youtube-dl загрузить их.
Одно замечание здесь заключается в том, что iframe с URL-адресом YouTube в атрибуте src
отсутствует в HTML-коде, загружаемом с сервера, и создается с помощью клиентского JavaScript. Для каждого видео мы получаем элемент, подобный этому:
<div class="elementor-element elementor-element-f28e248 elementor-aspect-ratio-169 elementor-widget elementor-widget-video" data-id="f28e248" data-element_type="widget" data-settings="{"youtube_url":"https:\/\/www.youtube.com\/watch?v=WDBlE0XeGGw","video_type":"youtube","controls":"yes","aspect_ratio":"169"}" data-widget_type="video.default">
Обратите внимание, что URL YouTube присутствует в JSON-строке в одном из значений атрибутов.
Код для парсинга URL-адресов YouTube и сохранения их в файле выглядит следующим образом.
#!/usr/bin/python3
import json
import requests
from lxml import html
def main():
resp = requests.get("https://dropservicemafia.com/free-course/")
tree = html.fromstring(resp.text)
video_divs = tree.xpath('//div[@data-widget_type="video.default"]')
out_f = open("urls.txt", "w")
for video_div in video_divs:
settings_json = video_div.get("data-settings")
settings_dict = json.loads(settings_json)
youtube_url = settings_dict.get("youtube_url")
if youtube_url is None:
continue
out_f.write(youtube_url + "\n")
out_f.close()
if __name__ == "__main__":
main()
Запуск этого скрипта дает файл urls.txt, содержащий ссылки на видео, с которыми мы можем запустить youtube-dl:
$ youtube-dl --batch-file=urls.txt --ignore-errors
Мы запускаем youtube-dl с параметром --ignore-errors
, так как мы хотим, чтобы инструмент не останавливался, когда сталкивается с некоторыми видео, которые были приватными.
В последнее время youtube-dl работал довольно медленно, но появляются новые проекты, основанные на том же концепте: