Descarga videos de la web con Python de forma rapida y facil
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 |
Para ver el código fuente de la página, damos click derecho en la página y seleccionamos inspeccionar elemento.
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:
1 |
2 |
3 |
Gracias por la atención prestada y espero que el contenido les sea de mucha utilidad.
Autor: Paul Martin Panez Caballero
Contacto: Google+
-
-
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 -
Excelente Paul por este nuevo aporte al blog. Saludos
-
-
Cuando empiezan los tutoriales en videoooooooooooo
-
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
-
Sigue sin funcionar pork ahora lo q se necesita es request
-
Gracias por tu sugerencia, ahora he agregado esa opcion al script https://gist.github.com/paulpanezc/ee4f8e06d58c1dfe09df
-
-
Ayuda por favor.
Còmo instalo PyAxel en ubuntu 14.04?
En la web se menciona a PyAxelWS, es lo mismo?
-
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
-
-
y para python 3 puede servir? digo, porque en python 3 ya no existe urllib2
-
Disculpa el codigo no funciona me tira error de sintaxis ya intente de todo para arregrarlo pero nada necesito ayuda ;v
-
Gracias por esta tremenda idea para descargar videos de internet creo que es una tremenda herramienta https://androidcasa.com/snaptube/
Deja una respuesta
Tiene fallos el script