Как я могу скачать бесплатные видео с YouTube или любого другого сайта с Python, без внешнего загрузчика видео? - PullRequest
0 голосов
/ 28 марта 2020

Проблема

Привет! Большинство ответов относятся к использованию pytube при использовании Python. Но проблема в том, что Pytube не работает для многих видео на YouTube. Он устарел, и я всегда получаю ошибки. Я также хочу иметь возможность получать другие бесплатные видео с других сайтов, которых нет на YouTube.

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

Следующий код работает для простых вещей. Очевидно, что это можно улучшить, но давайте сделаем это очень просто ...

import requests

good_url = 'https://www.w3schools.com/tags/movie.mp4'

bad_url = 'https://r2---sn-vgqsknes.googlevideo.com/videoplayback?expire=1585432044&ei=jHF_XoXwBI7PDv_xtsgN&ip=89.187.182.37&id=743bcee1c959e9cd&itag=244&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278%2C298%2C299%2C302%2C303&source=youtube&requiressl=yes&mh=1w&mm=31%2C26&mn=sn-vgqsknes%2Csn-ab5szn7z&ms=au%2Conr&mv=m&mvi=4&pl=23&pcm2=yes&initcwndbps=3728750&vprv=1&mime=video%2Fwebm&gir=yes&clen=22135843&dur=283.520&lmt=1584701992110857&mt=1585410393&fvip=5&keepalive=yes&beids=9466588&c=WEB&txp=5511222&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cpcm2%2Cvprv%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=ADKhkGMwRgIhAI3WtBFTf4kklX4xl859U8yzqavSzu-2OEn8tvHPoqAWAiEAlSDPhPdb5y4xPxPoXJFCNKr-h2c4jxKU8sAaaxxa7ok%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=ABSNjpQwRQIhAJkFK4xhfLraysF13jSZpHCoklyhJrwLjNSCQ1v7IzeXAiBLpVpYf72Gp-dlvwTM2tYzMcVl4Axzm2ARd7fN1gPW-g%3D%3D&alr=yes&cpn=EvFJNwgO-zNQOWkz&cver=2.20200327.05.01&ir=1&rr=12&fexp=9466588&range=15036316-15227116&rn=14&rbuf=0'

r = requests.get(good_url, stream=True)

with open('my_video.mp4', 'wb') as file:
    file.write(r.content)

Это работает. Но когда мне нужно видео на YouTube (и я, очевидно, не могу использовать обычный URL-адрес YouTube, поскольку запрос документа отличается от запроса на видео) ...

Шаги приняты

  1. Я проверю вкладку сети в инструментах разработчика, и она заполнена кучей запросов xhr. Заголовки для них всегда имеют очень длинный URL для запроса, accept-ranges: bytes и content-type: video/webm, или что-то подобное для mp4, et c.
  2. Затем я скопирую URL для этого xhr измените расширение файла на правильное и запустите программу.

Результат

Иногда при загрузке небольшого фрагмента видео без звука (несколько секунд) ) , и в других случаях он будет загружать больший кусок, но без изображения. Но я хочу, чтобы все видео со звуком.

Вопрос

Может кто-нибудь помочь мне понять, как это сделать, и объяснить, что происходит, будь то на другом сайте или YouTube?

Почему good_url работает, а не bad_url ??? Я подумал, что это может быть тайм-аут, поэтому я получил этот xhr и сразу проверил его из python, но все равно не повезло.

Соответствующий вопрос (не беспокойтесь об ответе на этот вопрос , если не требуется) ...

Иногда в YouTube также есть Blob URL-адреса в html, пример: <video src='blob:https://www.youtube.com/f4484c06-48ed-4531-a6ee-6a3ae0291d26'> ...

Я читал различные ответы что такое BLOB-объекты, и я не понимаю этого, потому что мне кажется, что URL-адрес BLOB-объекта выполняет XRR для изменения URL-адреса в DOM, как если бы он пытался выполнить эквивалент внутреннего перенаправления на веб-сервере. для личного файла, который будет обслуживаться на основе разрешений уровня представления / объекта. Это то, что происходит? Потому что я не вижу смысла, особенно когда эти видео бесплатны? Я сделал это, например, с ленивой загрузкой, чтобы получить атрибут data-src с правильным значением, а обработчик события onload запускает функцию, переключающую значение data-src на значение src.

...