Scrapeando tangos

Bajando información de los "creadores"

La idea de este post es mostrar una forma bien sencilla y rápida de webscraping. Particularmente, estamos trabajando en un proyecto para hacer análisis de letras de tango con NLP. En ese sentido, los datos relativos a los letristas, compositores, cantores y demás figuras dentro del tango probablemente resulten relevantes.

Este notebook muestra una implementación de una función simple de scraping.

La fuente: Todo Tango

El sitio Todo Tango tiene una gran cantidad de información acerca de letras, compositores, músicos, cantores y letristas de tango. Pero, además, tiene una estructura que la hace bastante fácil de scrapear (shhhhh...).

Básicamente, podemos acceder al link "maestro" que contiene todos los links de los llamados "creadores" (es decir, todas las figuras que nos interesan).

Ahí podemos ver que hay varias solapas por tipo de "creador". Pero existe una que es "Todos".

Luego, se nota que hay una solapa por cada letra del apellido. Pero, una vez más, hay una solapa ["*"] que contiene todos los links de los creadores.

Entonces, lo que vamos a tener que hacer es lo siguiente:

  1. scrapear todos los links que van a cada una de las páginas de los creadores
  2. entrar a todas las páginas de los creadores y scrapear la información que nos interesa

Lo bueno es que la información adentro de cada una de las páginas está bastante estructurada y es bastante fácil de scrapear.

Cómo hacerlo...

1) Primero, importamos los paquetes a utilizar

In [1]:
import urllib2
from bs4 import BeautifulSoup as soup
from numpy import random
import multiprocessing as mp
import json, codecs

2) Usando urlib2 y BeautifulSoup generamos una lista que contiene todos los links en la página de "los creadores"

In [2]:
index = urllib2.urlopen('http://www.todotango.com/creadores/listar/all/all/').read()
index_soup = soup(index,"html.parser")
index_link = []
for link in index_soup.find_all('a'):
    index_link.append(link.get('href'))

3) Nos quedamos con aquellos que corresponden a links de creadores (excluimos links a otras páginas, Twitter, etc.)

In [3]:
links_creadores = index_link[51:4676]
del links_creadores[1894]

4) Armamos una función que toma como argumentos la lista con links y un nombre de archivo.

In [4]:
def scrap_creadores(lista, save_file):
    creadores = []
    count = 0
    for i in lista:
        count += 1
        print count, 
        r = urllib2.urlopen(i).read()
        page_soup = soup(r,"html.parser") 
        name = page_soup.findAll('span', attrs={'id':'main_fichacreador1_encabezado1_lbl_NombreCompleto'})[0].get_text()
        cat = page_soup.findAll('span', attrs={'id':'main_fichacreador1_encabezado1_lbl_Categoria'})[0].get_text()
        fecha = page_soup.findAll('span', attrs={'id':'main_fichacreador1_encabezado1_lbl_Fechas'})[0].get_text()
        lugar = page_soup.findAll('span', attrs={'id':'main_fichacreador1_encabezado1_lbl_LugarNacimiento'})[0].get_text()
        creadores.append((i, name, cat, fecha,lugar))
        with open(save_file, 'wb') as f:
            json.dump(creadores, codecs.getwriter('utf-8')(f), ensure_ascii=False)
    return creadores

Explicación (breve) de la función:

4.1) Esta función recorre la lista de links

for i in lista:

4.2) descarga y parsea cada uno de los códigos html de cada página de los creadores

r = urllib2.urlopen(i).read()
page_soup = soup(r,"html.parser")

4.3) identifica la información biográfica relevante y la guarda en una variable

name = page_soup.findAll('span', attrs={'id':'main_fichacreador1_encabezado1_lbl_NombreCompleto'})[0].get_text()
cat = page_soup.findAll('span', attrs={'id':'main_fichacreador1_encabezado1_lbl_Categoria'})[0].get_text()
fecha = page_soup.findAll('span', attrs={'id':'main_fichacreador1_encabezado1_lbl_Fechas'})[0].get_text()
lugar = page_soup.findAll('span', attrs={'id':'main_fichacreador1_encabezado1_lbl_LugarNacimiento'})[0].get_text()

4.4) guarda todo en una lista generada previamente...

creadores.append((i, name, cat, fecha,lugar))

4.5) y, finalmente, escribe un archivo .txt con la lista

with open(save_file, 'wb') as f:
    json.dump(creadores, codecs.getwriter('utf-8')(f), ensure_ascii=False)

5) Ejecutamos la función

In [5]:
creador = scrap_creadores(links_creadores, "creadores.txt")
1 2 3 ... 4624

Con un poco de paciencia la función recorre los aproximadamente 4600 sitios de los creadores.

Podemos pasarlo a un dataframe...

In [8]:
import pandas as pd

cread = pd.DataFrame(creador)
cread.columns = ["link","Nombre","Tipo","Nacimiento-Fallecimiento","Lugar de nacimiento"]

Y guardamos los datos en un csv.

In [10]:
cread.to_csv('cread.csv',encoding='utf-8')

Coda

¿Qué nos queda? Bueno, bastante. Hasta acá tenemos los datos de los creadores. Estamos emprolijando unas funciones para bajar las letras de los tangos y bastante información al respecto del sitio. Nos está dando bastante trabajo la limpieza del dataset...

Una vez que estemos con eso... Arrancamos con la parte linda.

Comentarios

Entradas populares de este blog

Sobre la multicausalidad

Número efectivo de partidos en elecciones presidenciales 1983-2011

El ruido de las capitales (vol. 1)