Con Python prácticamente todo es posible gracias a la incontable cantidad de recursos disponibles en la red.

En esta ocasión vamos a ver como descargar contenidos de YouTube gracias a pytube.

pytube es una librería específica para descarga de contenido multimedia de youtube.

Entre sus principales características: es muy ligera, facilidad de uso, continuamente actualizada.

Instalar pytube

Lo más fácil es usar pip.

sudo pip install pytube

Aunque si prefieres puedes descargar los fuentes con git:

git clone git://github.com/nficano/pytube.git

O descargar el tar/gz

Usando pytube

Una vez instalado simplemente importamos la lib en nuestro proyecto y con un par de instrucciones tenemos el video/audio en nuestra máquina.

Por ejemplo, si queremos descargar un video a la carpeta de descargas de usuario: (debes cambiar «nuse» por tu usuario)

import pytube 
yt = pytube.YouTube("https://youtu.be/44XYEeD1A1U")
yt.streams.first().download("/home/nuse/Descargas/pytube")

yt.streams.first().download() sin parámetros descarga el archivo en el directorio de ejecución.

Puede que prefieras algo de información del contenido del video:

import pytube

url="https://youtu.be/44XYEeD1A1U"
path="/home/nuse/Descargas/pytube"

yt = pytube.YouTube(url)
 
print("Titulo .........: " + yt.title)
print("Duracion (seg)..: " + yt.length)
print("Descripcion.....: " +  yt.description)

O listar todos los stream disponibles:

import pytube

url="https://youtu.be/44XYEeD1A1U"
path="/home/nuse/Descargas/pytube"

yt = pytube.YouTube(url)

lstst=yt.streams.all()
for st in lstst:
    print(st)

yt.streams.all() devuelve una lista de elementos con todos los stream.

Es posible filtrar por contenido, por ejemplo, para recuperar sólo los stream de audio reemplaza yt.streams.all() por yt.streams.filter(only_audio=True).all()

import pytube

url="https://youtu.be/44XYEeD1A1U"
path="/home/nuse/Descargas/pytube"

yt = pytube.YouTube(url)
 
print("Titulo .........: " + yt.title)
print("Duracion (seg)..: " + yt.length)
print("Descripcion.....: " +  yt.description)

lstst=yt.streams.filter(only_audio=True).all()
for st in lstst:
    print(st)

En el caso de la lista de videos: yt.streams.filter(file_extension=»mp4″).all()

Cada stream se identifica de forma única por un itag:

<Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2">
<Stream: itag="171" mime_type="audio/webm" abr="128kbps" acodec="vorbis">
<Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus">
<Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus">
<Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus">

Puedes descargar uno específico con dicho itag:

import pytube

url="https://youtu.be/44XYEeD1A1U"
path="/home/nuse/Descargas/pytube"

yt = pytube.YouTube(url)
st=yt.streams.get_by_itag("171")
st.download(path)

Subtítulos

Otra opción muy útil es la posibilidad de listar los subtítulos disponibles y descargar los que nos interesen:

Para listar los subtítulos, en este caso del trailer de Games Of Thrones 8 temporada, utilizamos yt.captions.all()

import pytube
 
yt = pytube.YouTube("https://youtu.be/rlR4PJn8b8I")
lstcap=yt.captions.all()
for cap in lstcap:
    print(cap)

Devolverá la siguiente info, una linea por cada subtitulo:

<Caption lang="Inglés" code="en">
<Caption lang="Español (generados automáticamente)" code="es">
<...>

Y descargarlo indicando el code:

caption = yt.captions.get_by_language_code('en')

Para ver el contenido escribe la linea:

print(caption.generate_srt_captions())

El siguiente ejemplo python descarga los subtítulos en inglés del trailer de Juego de Tronos:

import pytube
 
yt = pytube.YouTube("https://youtu.be/rlR4PJn8b8I")
lstcap=yt.captions.all()
caption = yt.captions.get_by_language_code('en')

print(caption.generate_srt_captions())

Si quieres ejecutar y volcar salida a archivo ejecuta en un Terminal:

python testsubtiles.py > gotsubs8.txt

El archivo dará la siguiente salida:

<Caption lang="Inglés" code="en">
1
00:00:00,633 --> 00:00:04,671
(HEAVY BREATHING)

2
00:00:06,706 --> 00:00:07,674
(GASPS)

3
00:00:10,076 --> 00:00:11,577
ARYA STARK:<i> I know Death.</i>

4
00:00:11,677 --> 00:00:13,380
(PANTING)

5
00:00:14,981 --> 00:00:16,149
<i> He's got many faces.</i>

6
00:00:16,682 --> 00:00:18,518
(PANTING)

7
00:00:20,153 --> 00:00:22,088
I look forward to seeing this one.

8
00:00:25,325 --> 00:00:27,494
♪ (SUSPENSEFUL MUSIC PLAYS) ♪

9
00:00:29,028 --> 00:00:31,765
BRAN STARK:<i> Everything you did brought you where you are now.</i>

10
00:00:35,301 --> 00:00:36,403
<i> Where you belong.</i>

11
00:00:39,772 --> 00:00:40,774
<i> Home.</i>

12
00:00:44,110 --> 00:00:46,279
(DRAGON SCREECHES)

13
00:00:50,216 --> 00:00:51,418
JON SNOW:<i> They're coming.</i>


Saludos!

Referencias:

  • https://python-pytube.readthedocs.io
  • https://python-pytube.readthedocs.io/en/latest/api.html


3 comentarios sobre «Descargar videos y musica de Youtube con Python – pytube»

  1. hola, muy bueno el tuto te felicito.
    una pregunta
    se puede descargar en mp3?
    cuál sería el itag?
    y sabes de como se incorpora la búsqueda en un programa, es decir poder buscar en youtube para lueugo mediante ésta librería descargar.
    gracias.

    1. admin

      Hola Peter, hasta donde sé, el formato es siempre video, puedes convertir los mp4 a mp3 con ffmpeg:

      ffmpeg -i archivo.mp4 archivo.mp3

      En cuanto a buscar contenido en Youtube,
      mira esta página: http://www.3engine.net/wp/2015/01/como-buscar-videos-en-youtube-con-python/

      Gracias a ti por el comentario,
      feliz dia.

  2. Johan

    Hola, muchas gracias por el blog. Una pregunta es posible obtener los subtítulos de los videos sin el timer con alguna opción del comando o lo has hecho de otra forma?

    Slds

Deja tu comentario