TUTORIAL 2 WEBSCRAPING

Obteniendo información de las películas que te gustan

Para este tuto llevaremos acabo el scraping a una página que almacena información relacionada con películas, series y programas de TV, la gran IMDB. Partiremos desde su página principal http://www.imdb.com/ para irnos sumergiendo en páginas especificas , donde sabemos, se encuentran los detalles de la películas drámaticas que nos encantan y así extraer la información

Debido a que este tipo de webs contiene muchísimos links anidados a la página principal, nos enfocaremos sólo con los que estan en la barra derecha, ¡vaya trabajo si deseamos conseguir todos los links!

BIEN, AQUÍ VAMOS

Nuevamente usaremos las librerías urllib2, bs4 y re, que como ya sabemos, nos permiten obtener la página que deseamos "scrapear", analizarla y encontrar patrones o partes que son de nuestro interés.


In [17]:
import urllib2
import bs4
import re

Creamos una variable string con la url de la página principal de imdb y una lista donde almacenaremos las ligas que encontraremos en la barra derecha de dicha página, "Opening this week". Utilicemos la función crearSopa creada en el tuto anterior, la cual genera la sopa del codigo html de la página web e inmediatamente la generamos guardandola en sopaGrande


In [18]:
laliga = "http://www.imdb.com/" # La pagina tronco de la cual derivaremos
paginas = []                    # almacena los links que llevan a las páginas de las peliculas

In [19]:
def crearSopa(aurl):
    pageUrl = urllib2.urlopen(aurl)	
    pageHtml = pageUrl.read()
    pageUrl.close()
    return bs4.BeautifulSoup(pageHtml)    #devolvemos la sopa de la página web
sopaGrande = crearSopa(laliga)

Debemos enfocar nuestra búsqueda en bloques de código donde haya links, pues muchos de estos nos llevarán a los detalles de películas. Localizada ya, como se muestra en el video y acontinuación, la parte de código que nos interesa

Creamos código que nos permita dirigirnos a esos links y tomar lo que necesitamos

Usando el método find_all capturamos todas las etiquetas que contienen links (tags "a"), pero que poseen el atributo href comenzando con el fragmento '/title', y las almacenamos en nuestra lista paginas . El carácter '^' especifica que nuestra expresión regular comience con esa cadena exactamente


In [20]:
etiquetas = sopaGrande.find_all("a",href=re.compile("^/title"))
for link in etiquetas:           # link va guardando las etiquetas en bruto
    link=str(link.get("href"))
    paginas.append(link)
print(paginas[0])                # la salida corresponde a una parte del url de la página que contiene la reseña


/title/tt2639254?ref_=hm_hp_i_1

Notar que la lista paginas guarda una porción de la url real que nos lleva a las páginas pues el link se completa añadiendo la cadena laliga, es decir, la url completa para la primer pélcula obtenida es...


In [21]:
peliculaLiga = laliga + paginas[0] 
print(peliculaLiga)                #URL completa


http://www.imdb.com//title/tt2639254?ref_=hm_hp_i_1

OBSERVEMOS EL CÓDIGO FUENTE DE NUEVO

Hasta aquí, podemos conseguir todos los links colgados en la barra derecha nombrada Opening this week, pues basta ir cambiando el índice de nuestra lista paginas para ir generando las URL completas a cada película.

Buscando a tráves del código se llega a que dentro de

estan todos los detalles y puntuaciones de la película. Entonces ahora generamos otra sopa


In [22]:
sopita = crearSopa(peliculaLiga)       # peliculaLiga = http://www.imdb.com//title/tt2639254?ref_=hm_hp_i_1
info = sopita.find_all("td",{"id":"overview-top"})
for link in info: 
    link = str(link.renderContents())

In [ ]:
def hacerCadena(que):
    return str(que.renderContents())

def getTitulo(sopa):
    x = sopa.find_all("span",{"itemprop":"name"})
    print("Titulo: \n"+hacerCadena(x[0]))

def getSinopsis(sopa):
    x = sopa.find_all("p",{"itemprop":"description"})
    print "Sinopsis: "+hacerCadena(x[0])

def getDirector(sopa):
    tag = sopa.find_all("div",{"itemprop":"director"})
    tag2 = tag[0].contents  
    tag3 = tag2[3].contents
    print "Director: \n"+hacerCadena(tag3[0])

In [ ]:
getTitulo(sopita)
getSinopsis(sopita)
getDirector(sopita)

In [ ]: