Descarga videos de la web con Python de forma rapida y facil

Descargar vídeos con Python
Descargar vídeos con Python

Agradezco la oportunidad brindada por Mi Diario Python y Diego Caraballo. En esta ocasión vamos a ver como usar dos librerías que nos ayudaran a la hora de extraer archivos como vídeos o audio (data en general) y acelerar el proceso de descarga, nos referimos a BeautifulSoup y PyAxel respectivamente.

Comencemos con la instalación:

pip install beautifulsoup4
pip install PyAxel

Puedes ver también: Como instalar pip en Linux y Windows

Hay que aclarar que debemos tener instalado Axel previamente para utilizar PyAxel.

BeautifulSoup4
Es una librería de Python que se utiliza para extraer datos de archivos HTML Y XML. Esta herramienta nos ahorra muchísimo tiempo a la hora de extraer datos de una página web (web scraping).

PyAxel
Es una librería de Python que funciona como un acelerador de descargas que funciona a la perfección con protocolos http y ftp.

Como ejemplo de este post vamos a descargar el vídeo que sale semanalmente del anime One Piece. Antes yo obtenía la url del archivo de vídeo de forma manual de la siguiente forma:

1 - Ingresaba la url del episodio en el navegador, en este caso es http://www.chia-anime.tv/watch/one-piece-episode-685/ y buscaba en el código fuente la segunda etiqueta iframe y en su atributo src encontraba la url del vídeo:

url del video
url del video

Para ver el código fuente de la página, damos click derecho en la página y seleccionamos inspeccionar elemento.

2 - Ingresaba la url del video en el navegador, en este caso es http://static.chia-anime.com/muembed.php?rand=1234&file=wqxkykbbclyw.html y buscaba en el código fuente de esta segunda página el archivo de vídeo mp4
url con mp4
url con mp4

Con el tiempo me di cuenta que esto se podía automatizar y use los pasos descritos anteriormente como lógica para construir el siguiente script python:

import os
import urllib2
from bs4 import BeautifulSoup
 
os.system("clear")
 
# https://stackoverflow.com/questions/328356/extracting-text-from-html-file-using-python
episode = raw_input("Ingrese el episodio de One Piece a descargar: ")
url = "http://www.chia-anime.tv/watch/one-piece-episode-"+episode+"/"
html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html)
# https://stackoverflow.com/questions/23028664/python-beautifulsoup-iframe-document-html-extract
iFrames=[]
for iframe in soup("iframe"):
    # https://stackoverflow.com/questions/8289957/python-2-7-beautiful-soup-img-src-extract (second answer)
    iFrames.append(soup.iframe.extract()["src"])
url = iFrames[2]
html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html)
params=[]
for param in soup("param"):
    js = soup.param.extract()["value"]
    params.append(js)
video = params[1][182:237]
os.system('pyaxel ' + video)

  • Declaramos las librerías que utilizaremos
import os
import urllib2
from bs4 import BeautifulSoup

  • Solicitamos al usuario que ingrese el episodio a descargar y obtenemos el código html con BeautifulSoup luego de formar la url
os.system("clear")
 
# https://stackoverflow.com/questions/328356/extracting-text-from-html-file-using-python
episode = raw_input("Ingrese el episodio de One Piece a descargar: ")
url = "http://www.chia-anime.tv/watch/one-piece-episode-"+episode+"/"
html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html)

  • Creamos una lista donde almacenamos específicamente el atributo src de todas las etiquetas iframe
# https://stackoverflow.com/questions/23028664/python-beautifulsoup-iframe-document-html-extract
iFrames=[]
for iframe in soup("iframe"):
    # https://stackoverflow.com/questions/8289957/python-2-7-beautiful-soup-img-src-extract (second answer)
    iFrames.append(soup.iframe.extract()["src"])

  • Repetimos el paso anterior con la nueva url (tomamos el segundo elemento de la lista porque es una constante donde se encuentra la url del vídeo), pero en este caso la lista creada almacenará el atributo value de todas las etiquetas param
url = iFrames[2]
html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html)
params=[]
for param in soup("param"):
    js = soup.param.extract()["value"]
    params.append(js)

  • Conseguimos la url del vídeo en el string que ocupa la posición 1 de la lista, entre las posiciones 182 y 237 (otra constante encontrada); al final pasamos la url a PyAxel para que proceda con la descarga
video = params[1][182:237]
os.system('pyaxel ' + video)

Los comentarios (#) del código hacen referencia al código utilizado que no es de mi autoría.

Para finalizar mostramos la prueba respectiva:

Descargar video en python
1

Descargar video en python
2

Descargar video en python
3

Gracias por la atención prestada y espero que el contenido les sea de mucha utilidad.

Autor: Paul Martin Panez Caballero

Contacto: Google+

  1. Unknown dice:

    Tiene fallos el script

    1. Paul M. Panez Caballero dice:

      Disculpa por la respuesta tardía. Efectivamente el script presentado puede presentar fallos debido a dos razones principalmente: la actualización de la librería Beautifulsoup4 (4.3.2 -> 4.4.1) y cambios en el html de las páginas de donde se extraen datos.

      Comparto el script con las modificaciones pertinentes https://gist.github.com/paulpanezc/ee4f8e06d58c1dfe09df
      y agradezco por las sugerencias

    2. PythonDiario dice:

      Excelente Paul por este nuevo aporte al blog. Saludos

  2. Unknown dice:

    Cuando empiezan los tutoriales en videoooooooooooo

  3. Manuel dice:

    NO es mejor asi por imagenes porque los que carecen de INTERNET como yo le es muy dificil ver un video osea no lo puedo ver

  4. Unknown dice:

    Sigue sin funcionar pork ahora lo q se necesita es request

    1. Paul M. Panez Caballero dice:

      Gracias por tu sugerencia, ahora he agregado esa opcion al script https://gist.github.com/paulpanezc/ee4f8e06d58c1dfe09df

  5. Anónimo dice:

    Ayuda por favor.

    Còmo instalo PyAxel en ubuntu 14.04?

    En la web se menciona a PyAxelWS, es lo mismo?

    1. Paul M. Panez Caballero dice:

      Lamentablemente ya no se puede instalar PyAxel directamente desde pip o easy_install. Lo que puedes hacer es descargar el tar.gz desde esta url: https://www.dropbox.com/s/bea4l32v9u93df4/PyAxel-0.1.tar.gz

  6. Mauricio José Tobares dice:

    y para python 3 puede servir? digo, porque en python 3 ya no existe urllib2

  7. Fabian dice:

    Disculpa el codigo no funciona me tira error de sintaxis ya intente de todo para arregrarlo pero nada necesito ayuda ;v

  8. cinemay dice:

    Gracias por esta tremenda idea para descargar videos de internet creo que es una tremenda herramienta https://androidcasa.com/snaptube/

Deja una respuesta

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

Subir
White Monkey