Google+ Seguidores

miércoles, 6 de mayo de 2015

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

    6

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+

6 comentarios:
Write comentarios
  1. Respuestas
    1. 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

      Eliminar
    2. Excelente Paul por este nuevo aporte al blog. Saludos

      Eliminar
  2. Cuando empiezan los tutoriales en videoooooooooooo

    ResponderEliminar
  3. 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

    ResponderEliminar
  4. Sigue sin funcionar pork ahora lo q se necesita es request

    ResponderEliminar

Tu comentario es importante y nos motiva a seguir escribiendo...

Entradas más recientes

© 2014 Mi diario Python. Designed by Bloggertheme9 | Distributed By Gooyaabi Templates
Powered by Blogger.