La importancia de la extracción de datos y el web scraping: Retos y soluciones

La importancia de la extracción de datos y el web scraping: Retos y soluciones

La extracción de datos ha adquirido una relevancia crucial en el mundo actual, donde la información es el recurso más valioso. Web scraping es una de las técnicas más poderosas para obtener datos de fuentes en línea de forma automatizada, permitiendo a las organizaciones acceder a información que no está disponible de manera estructurada o que sería difícil de recopilar manualmente. En este artículo, abordaremos la importancia del web scraping, los desafíos que puede presentar y cómo funciona un código en Python utilizando Selenium para automatizar este proceso, ejemplificando con la extracción de datos de los postulantes al SERUMS en la región La Libertad, Perú, desde la página de la SUNEDU (https://enlinea.sunedu.gob.pe/).

¿Qué es el Web Scraping y por qué es importante?

El web scraping es una técnica que permite extraer datos de sitios web, normalmente no estructurados, y convertirlos en un formato estructurado y útil, como una hoja de cálculo o una base de datos. Esta técnica es vital para diversos campos, como:

  • Análisis de mercado: Las empresas pueden extraer precios de competidores, reseñas de productos, o tendencias del consumidor.
  • Investigación académica: Los investigadores pueden obtener grandes volúmenes de datos de fuentes en línea para análisis posteriores.
  • Monitoreo de noticias y redes sociales: La capacidad de extraer información en tiempo real es crucial para mantener actualizada a la empresa o institución.

En el contexto de la región La Libertad, Perú, la extracción de datos de los postulantes al SERUMS permite analizar información clave sobre los títulos profesionales registrados de los candidatos, facilitando la gestión y verificación de sus credenciales.

Retos del Web Scraping

A pesar de los beneficios, el web scraping presenta varios desafíos:

  1. Capchas: Muchos sitios web usan CAPTCHAs para evitar el acceso automatizado. Resolver estos CAPTCHAs puede ser complicado y, en algunos casos, requiere técnicas avanzadas de reconocimiento óptico de caracteres (OCR).
  2. Restricciones de tiempo y disponibilidad: Algunos sitios web pueden bloquear temporalmente o limitar el número de solicitudes desde una IP específica, lo que puede interrumpir el proceso de scraping.
  3. Estructuras web dinámicas: Las páginas web modernas suelen cargar datos de manera dinámica usando JavaScript, lo que hace que los datos no estén disponibles en el código HTML inicial.

Ejemplo: Web Scraping con Selenium para extraer datos de la SUNEDU

A continuación, se explica un código en Python que utiliza la librería Selenium para realizar scraping en la página de la SUNEDU y obtener los títulos profesionales de los postulantes al SERUMS en La Libertad. El código realiza las siguientes acciones:

Explicación del código

El código comienza importando las bibliotecas necesarias como Selenium, pandas, cv2, y pytesseract, que son esenciales para el procesamiento de imágenes y la automatización del navegador.

El siguiente paso es leer un archivo CSV que contiene los datos de entrada, en este caso, los nombres completos de los estudiantes. El código combina los campos de nombres y apellidos en una sola columna llamada Nombre completo para que cada iteración del scraping use ese dato en la búsqueda.

df = pd.read_csv('data_trujillo/resultados_medicina_trujillo.csv')
df['Nombre completo'] = df['Apellido Paterno'] + ' ' + df['Apellido Materno'] + ' ' + df['Nombres']

Automating the browser

El siguiente paso es configurar Selenium para que funcione en modo headless, lo que significa que el navegador se ejecuta en segundo plano sin abrir una ventana visible. Esto es útil para ahorrar recursos cuando se necesita extraer datos en masa.

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--incognito")
service = Service('C:/ruta/a/chromedriver.exe')
driver = webdriver.Chrome(service=service, options=chrome_options)

Interacción con el formulario web

Selenium se utiliza para interactuar con el sitio web que contiene los datos deseados. El código espera hasta que los elementos interactivos, como botones o campos de texto, sean visibles, y luego realiza la interacción, como hacer clic en botones y escribir nombres en campos de búsqueda.

menu_button = WebDriverWait(driver, 30).until(
    EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div[2]/div[3]/div/div[2]/div/a/div"))
)
menu_button.click()

Captcha y procesamiento de imágenes

Uno de los mayores desafíos del web scraping es la gestión de captchas, un sistema de verificación que los sitios web utilizan para evitar accesos automatizados. En este caso, el código captura la imagen del captcha y la procesa utilizando la biblioteca OpenCV y Tesseract para intentar extraer el texto automáticamente.

captcha_image = WebDriverWait(driver, 30).until(
    EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/div/div/div/div/div[1]/div[1]/div/form/div[3]/div[2]/fieldset/span/img"))
)
captcha_image.screenshot('captcha.png')
text = pytesseract.image_to_string(cv2.imread('captcha.png'), lang='eng').strip()

Obtención de datos y manejo de excepciones

Una vez que se ha ingresado el captcha y el nombre del estudiante, el código extrae los resultados, como el nombre, título e institución. Se incluye un sistema de manejo de errores para asegurarse de que, si ocurre un problema (como un elemento que no se carga o una página que no responde), el código no se interrumpe, sino que reintenta varias veces hasta obtener los resultados.

try:
    nombre = driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/div/div[1]/div[3]/div/div[1]/div[2]/div/table/tbody[1]/tr[1]/td[1]").text
except NoSuchElementException:
    # Intentar la segunda fila si la primera no existe
    nombre = driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/div/div[1]/div[3]/div/div[1]/div[2]/div/table/tbody[1]/tr[2]/td[1]").text

Desafíos del Web Scraping

Si bien el web scraping ofrece muchas oportunidades, presenta desafíos significativos:

  1. Captchas: Los captchas están diseñados para evitar el acceso automatizado, y resolverlos de manera automática no siempre es eficaz.
  2. Cambios en la estructura de la página web: Las páginas web pueden cambiar su diseño, lo que rompe los selectores de XPath que el código usa para encontrar elementos.
  3. Bloqueo por el servidor: Algunos sitios web implementan mecanismos para bloquear usuarios que realizan solicitudes automáticas, lo que puede detener el proceso de scraping.
  4. Tiempo de carga: Dependiendo de la velocidad del sitio web, puede ser necesario esperar a que los elementos se carguen, lo que incrementa el tiempo total de extracción.

GITHUB

Se puede encontrar en mi github