Social Data Consulting

Web Scraping con Python a Actas Electorales 2021 del Perú

En este post les mostrare de forma sencilla, pero 💪poderosa como comprender la utilidad de web scraping. Y lo explicare con el caso de Actas Electorales 2021 en el Perú, en la cual descargaremos el detalle de la mesa electoral en un archivo csv y las actas presentadas en mesa.

Requisitos

  1. Python 3 o superior.
  2. Tener instalado y configurado Selenium.

¿Qué es Web Scraping?

Siempre es importante el ¿comó?, pero no hay que olvidar el ¿qué?. Entonces, Web Scraping es la recolección de información de sitios web de forma automatica.

Web scraping o raspado web, es una técnica utilizada mediante programas de software para extraer información de sitios web.​ Usualmente, estos programas simulan la navegación de un humano en la World Wide Web ya sea utilizando el protocolo HTTP manualmente, o incrustando un navegador en una aplicación. Wikipedia

Vamos al Codigo

Explicare de forma general el codigo utilizado para extraer informacion de la pagina de estudio de resultados presidenciales. Para realizar webscraping existen muchas librerias, nosotros nos basaremos en Selenium. Elegi esta libreria porque utiliza un navegador en especifico como medio para realizar Scraping, ademas de ser visible las interacciones. Ahora, para usar un navegador de por medio Selenium hace uso de un driver dependiendo del navegador que se usara. En este caso usare geckodriver que es el driver para Firefox.  

# Importamos las librerias necesarias
import os
import time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

Definimos una función que nos servira para cambiar el nombre del documento descargado.

def tiny_file_rename(newname, folder_of_download,time_to_wait):
    time_counter = 0
    filename = max([f for f in os.listdir(folder_of_download)], key=lambda xa :   os.path.getctime(os.path.join(folder_of_download,xa)))
    while '.part' in filename:
        time.sleep(1)
        time_counter += 1
        if time_counter > time_to_wait:
            raise Exception('Espere demasiado para descargar el archivo')
    os.rename(os.path.join(folder_of_download, filename), os.path.join(folder_of_download, newname))
# Fuente:https://stackoverflow.com/questions/34548041/selenium-give-file-name-when-downloading

Definimos la carpeta donde se descargaran las actas electorales y algunos números de mesa de las cuales extrairemos información. Seguidamente pasamos a inicializar el webdriver en la pagina de estudio. Esto abrira una ventana del navegador firefox. Esto puede tardar, tener paciencia.

# Ruta de la carpeta donde guardaremos las descargas. Ubicando la carpeta
# donde esta el archivo actual y más precisamente la carpeta "archivos_descargados"
newpath = os.path.join(os.getcwd(), "archivos_descargados")

profile = webdriver.FirefoxProfile() 
# Cambiamos la carpeta de descargas
profile.set_preference("browser.download.dir", newpath)
profile.set_preference("browser.download.folderList", 2) 
# Evitamos que nos pregunte si descargar o no estos tipos de archivos
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/plain,text/x-csv,text/csv,application/ms-excel,application/vnd.ms-excel,application/csv,application/x-csv,text/csv,text/comma-separated-values,text/x-comma-separated-values,text/tab-separated-values,application/pdf")

numeros_mesa = ["030390", "030391", "034244" , "034245"]
driver = webdriver.Firefox(firefox_profile=profile)
driver.get("https://www.resultadossep.eleccionesgenerales2021.pe/SEP2021/Actas/Numero")
#
Imagen 1. Web de Resultados Electorales

Una vez iniciado el webdriver en la pagina de estudio procedemos a identificar, en la pagina web, el campo(el input) donde se ingresa el número de mesa. Ingresamos el número de mesa y descargamos la informacion deseada. Como la información de la mesa esta en la web deberemos extraer ello, o podemos descargar el archivo csv, que si lo revisamos es la data que esta en la web. Tambien descargaremos, lo más interesante a mi parecer, la acta electoral donde se encuentra la contabilidad de los votos y las firmas de esa mesa.

for n_mesa in numeros_mesa:
    print(f"------------{n_mesa}------------")
    print("Detectando input...")
    # seleccionamos el campo donde se ingresa el número de mesas
    input_mesa = driver.find_element("css selector", "input.input_mesas")
    time.sleep(3) # Esperamos 3 segundos
    input_mesa.clear() # Limpiamos el campo
    input_mesa.send_keys(n_mesa) # Ingresamos el número de mesa
    time.sleep(1) # Esperamos 1 segundo

    print("Buscando...mesa n°"+n_mesa)
    input_mesa.send_keys(Keys.ENTER) # Presionamos enter
    time.sleep(5)

    # Obtenemos información de la mesa para cambiar el nombre de los archivos
    ubicacion_votacion = driver.find_element("css selector", ".borde_gris.text-center").text.split("\n")
    ubicacion_votacion[2] = n_mesa
    ubicacion_votacion = " - ".join(ubicacion_votacion)
    ubicacion_votacion = ubicacion_votacion.replace("NOMBRE DE LOCAL: ", "").replace(" - ", "_")
    print("Nombre de archivo: "+ubicacion_votacion)
    time.sleep(2)

    # Hacemos click en el boton que descargara el archivo csv
    driver.find_element("css selector", "div.botonera_print a:nth-child(2)").click()
    print("Descargando: "+ubicacion_votacion+".csv")
    # Cambiamos el nombre del archivo recien descargado
    tiny_file_rename(ubicacion_votacion+".csv", newpath, time_to_wait=60)
    time.sleep(3)

    # Obtenemosla url del acta electoral
    urlActaPdf = driver.find_element("css selector", "div.gutters-20 div:nth-child(2) a").get_attribute("href")
    print("URL PDF: "+urlActaPdf)
    pdf_path = os.path.join(newpath, ubicacion_votacion+".pdf")
    # Descargamos el acta electoral
    response = requests.get(urlActaPdf, stream=True) 
    with open(pdf_path, 'wb') as f:
       f.write(response.content)
       print("Descargando: "+ubicacion_votacion+".pdf")
# Cerrar el webdriver
driver.close()
#

Y de esta manera sencilla ya tenemos acceso a información de las mesas electorales. Puedes revisar el codigo en mi github.

Imagen 2. Archivos descargados
Imagen 3. Acta 030390

En este ejemplo hemos visto la utilidad de web scraping con Python. Si quieres aprender a recolectar información de forma automatica de la web revisa el curso gratuito de Web Scraping con Python donde aprenderas desde cero  hasta el estudio de casos diversos.

Share via
Copy link