Cómo descargar vídeos de Youtube con Pytube

Cómo descargar vídeos de Youtube con Pytube Leave a comment

Comparte este Post

Cómo descargar vídeos de Youtube con Pytube

 Cómo descargar vídeos de Youtube con Pytube

¡Hola! En este tutorial vamos a aprender cómo descargar vídeos de Youtube con python utilizando la librería pytube. Se acabaron los plugins de navegador y el tener que recurrir a páginas llenas de pop-ups: con un puñado de líneas de código vamos a poder descargar cualquier vídeo de Youtube y guardarlo en nuestro ordenador.


Instalar pytube

Empezaremos por instalar pytube con pip. En la Terminal escribimos:

pip install pytube

Alternativamente también podemos clonar el repositorio de github si no tenemos pip:

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

Hace poco, YouTube ha cambiado el sistema de cifrado de sus vídeos. Esto hace que pytube dé un error muy feo si se intenta descargar algo:

pytube.exceptions.RegexMatchError: regex pattern (yt\.akamaized\.net/\)\s*\|\|\s*.*?\s*c\s*&&\s*d\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\() had zero matches

En el momento en que he empezado a redactar este tutorial (5/12/2018) todavía no ha salido ninguna actualización de la librería pytube que solucione este error, así que tendremos que arremangarnos la camisa y arreglarlo nosotros mismos.

Tenemos que navegar al directorio dónde esté instalado pytube (en linux, /usr/local/lib/python3.5/dist-packages/pytube/), abrir el archivo ‘cypher.py’ y cambiar la función ‘get_initial_function_name(js)’ por:

def get_initial_function_name(js):
    """Extract the name of the function responsible for computing the signature.

    :param str js:
        The contents of the base.js asset file.

    """
    # c&&d.set("signature", EE(c));
    pattern = [
        r'\bc\s*&&\s*d\.set\([^,]+,.*?\((?P<sig>[a-zA-Z0-9$]+)\(\(0\s*,\s*window.decodeURIComponent',
        r'yt\.akamaized\.net/\)\s*\|\|\s*',
        r'.*?\s*c\s*&&\s*d\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(',
        r'\.sig\|\|(?P<sig>[a-zA-Z0-9$]+)\(',
        r'\bc\s*&&\s*d\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(',
    ]
    logger.debug('finding initial function name')
    return regex_search(pattern, js, group=1)


Si nos fijamos, la única cosa que hemos hecho es añadir otro patrón (el primero) a la lista de patrones. Puede que en un futuro sea necesario añadir más patrones según Youtube vaya cambiando.


Descargar un vídeo

Para descargar un vídeo con pytube nos bastan unas pocas líneas de código. Vamos a probar de bajar este vídeo y guardarlo en el directorio dónde estemos trabajando.

import pytube

video = pytube.YouTube('https://www.youtube.com/watch?v=4pTwQKMrTt0')
video.streams.first().download()


También podríamos poner el path dónde queremos guardar el vídeo:

video.streams.first().download('/home/<Mi Nombre>/Descargas/videos')


Es así de fácil.


Listar información

Pytube nos permite mostrar información del vídeo: título, duración, etc.

Este código mostrará el título, la descripción, la duración y la puntuación del vídeo:

import pytube

video = pytube.YouTube('https://www.youtube.com/watch?v=4pTwQKMrTt0')

print('-Titulo: ', video.title)
print('-Descripcion: ', video.description)
print('-Duracion: ', video.length, ' segundos')
print('-Puntuacion: ', video.rating)



Streams y formatos

También podemos listar todos los streams disponibles para el vídeo. En este código guardamos todos los streams en el vector ‘formatos’ y los listamos.

import pytube

video = pytube.YouTube('https://www.youtube.com/watch?v=4pTwQKMrTt0')
formatos = video.streams.all()

print('Formatos disponibles:')
for i in formatos:
	print(i)


Si queremos, podemos filtrar los streams por formato. En este código guardamos sólo los que estén en formato ‘.mp4’:

import pytube

video = pytube.YouTube('https://www.youtube.com/watch?v=4pTwQKMrTt0')

formatos = video.streams.filter(file_extension='mp4').all()

print('Streams en formato mp4:')
for i in formatos:
	print(i)


 

O también podemos quedarnos sólo con los que contengan audio:

import pytube

video = pytube.YouTube('https://www.youtube.com/watch?v=4pTwQKMrTt0')

formatos = video.streams.filter(only_audio=True).all()

print('Streams en formato mp4:')
for i in formatos:
	print(i)

Por último, podemos descargar un stream en concreto. Fíjemonos que cuando listamos los streams, cada uno empieza por un campo llamado ‘itag’.

Este campo sirve para identificar el vídeo. Para bajar un vídeo con el ‘itag’ que queremos:

import pytube

video = pytube.YouTube('https://www.youtube.com/watch?v=4pTwQKMrTt0')

formatos = video.streams.filter(only_audio=True).all()

print('Streams en formato mp4:')
for i in formatos:
	print(i)

video.streams.get_by_itag('22').download() #Descargamos el primer video

Subtítulos

Si el vídeo tiene subtítulos, también podemos listarlos y descargarlos. Vamos a probarlo con esta escena del Hundimiento, un clásico del cine bélico.

import pytube

video = pytube.YouTube('https://www.youtube.com/watch?v=t7PmzdINGZk')

subs = video.captions.get_by_language_code('en') #Bajar los subtitulos en ingles
print(subs.generate_srt_captions()) #Mostrarlos en pantalla

via https://robologs.net


Comparte este Post

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Abrir chat
0

Tu carrito