CoderCastrov logo
CoderCastrov
Парсер

Как скачать встроенные видео

Как скачать встроенные видео
просмотров
3 мин чтение
#Парсер
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="{&quot;youtube_url&quot;:&quot;https:\/\/www.youtube.com\/watch?v=WDBlE0XeGGw&quot;,&quot;video_type&quot;:&quot;youtube&quot;,&quot;controls&quot;:&quot;yes&quot;,&quot;aspect_ratio&quot;:&quot;169&quot;}" 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 работал довольно медленно, но появляются новые проекты, основанные на том же концепте: