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.
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
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.
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
time
requests
from
selenium
webdriver
selenium.webdriver.common.by
By
selenium.webdriver.common.keys
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'
filename:
time.sleep(
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)
"browser.download.folderList"
,
2
# Evitamos que nos pregunte si descargar o no estos tipos de archivos
"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"
#
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.
n_mesa
numeros_mesa:
print
(f
"------------{n_mesa}------------"
(
"Detectando input..."
# seleccionamos el campo donde se ingresa el número de mesas
input_mesa
driver.find_element(
"css selector"
"input.input_mesas"
3
# Esperamos 3 segundos
input_mesa.clear()
# Limpiamos el campo
input_mesa.send_keys(n_mesa)
# Ingresamos el número de mesa
# Esperamos 1 segundo
"Buscando...mesa n°"
n_mesa)
input_mesa.send_keys(Keys.ENTER)
# Presionamos enter
5
# Obtenemos información de la mesa para cambiar el nombre de los archivos
ubicacion_votacion
".borde_gris.text-center"
).text.split(
"\n"
ubicacion_votacion[
" - "
.join(ubicacion_votacion)
ubicacion_votacion.replace(
"NOMBRE DE LOCAL: "
, "
").replace("
-
", "
_")
"Nombre de archivo: "
ubicacion_votacion)
# Hacemos click en el boton que descargara el archivo csv
"div.botonera_print a:nth-child(2)"
).click()
"Descargando: "
".csv"
# Cambiamos el nombre del archivo recien descargado
tiny_file_rename(ubicacion_votacion
, newpath, time_to_wait
60
# Obtenemosla url del acta electoral
urlActaPdf
"div.gutters-20 div:nth-child(2) a"
).get_attribute(
"href"
"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)
# 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.
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.