¿Es posible rastrear el portal de trabajo K?

힘센캥거루
2025년 5월 28일(수정됨)
48
python

Recientemente, al ver que el portal de trabajo K muestra los títulos de los documentos oficiales en intervalos de 3 meses, pensé en esto.

¿Y si recopilamos todos los títulos de documentos oficiales mediante crawling y los organizamos en un archivo de Excel de 3 años?

Parecía que sería posible buscar fácilmente los números de documentos oficiales utilizando un filtro.

Pero la conclusión es que fue imposible.

¿Es posible rastrear el portal de trabajo K?-1

1. Todo el mundo tiene un plan.

Este era mi gran plan.

1. Utilizar Selenium de Python para acceder y iniciar sesión en el portal de trabajo.
2. Usar xpath para recopilar las filas y celdas dentro de la etiqueta table y convertirlo en un DataFrame.
3. Utilizar datetime y delta para calcular las fechas y recopilar los documentos cada 3 meses.
4. Colocar los datos en Excel o Google Sheets y usarlos adecuadamente.

Sin embargo, al ingresar al portal de trabajo, no pude encontrar ni una tabla ni un iframe.

Después de 4 horas de intentarlo, escribo sobre por qué el crawling fue imposible.

2. ¿Tu seguridad?

1. WebDRM

¿Es posible rastrear el portal de trabajo K?-2

La primera barrera fue WebDRM.

Debido a esto, no podía activar el modo desarrollador.

Sin embargo, descubrí que si el modo desarrollador ya estaba activado, se mantenía al acceder al sitio.

Finalmente logré activar el modo desarrollador.

2. ¿Se ve en el navegador pero no hay elementos?

Esta parte fue la más difícil de entender.

Aunque los elementos eran claramente visibles en el modo desarrollador, al usar page_source con ChromeDriver, no aparecía ninguno.

Esto sucedía tanto con Selenium como con Puppeteer.

Lo más sorprendente es que incluso usando JavaScript en la consola, los elementos no aparecían.

Esa sensación de estar cerca pero no encontrarlo me volvió loco.

const puppeteer = require('puppeteer');
const fs = require('fs');
// Script para obtener el HTML de una página web usando Puppeteer

(async () => {
  let browser;
  try {
    browser = await puppeteer.launch({
      headless: false,
      args: ['--no-sandbox', '--disable-setuid-sandbox'],
      defaultViewport: null,
      userDataDir: './user_data',
    });

    const page = await browser.newPage();

    await page.goto('https://klef.goe.go.kr/keris_ui/main.do', {
      waitUntil: 'networkidle0', // Esperar hasta que todos los recursos estén cargados
      timeout: 60000, // Esperar hasta 60 segundos
    });

    const html = await page.content();
    fs.writeFileSync('schoolDoc.html', html, 'utf8');
    console.log('HTML guardado como schoolDoc.html.');

  } catch (error) {
    console.error('Error:', error);
  } finally {
    if (browser) await browser.close();
  }
})();

Al reabrir el archivo guardado, vi algo así.

No aparecía la tabla que buscaba, solo el módulo de inicio de sesión.

¿Es posible rastrear el portal de trabajo K?-3

Al pensar por qué sucedía esto, llegué a la conclusión de que la tabla que muestra los documentos oficiales podía no ser parte de un programa instalado por separado.

Con ese pensamiento, fue más fácil rendirse.

3. El portal de trabajo usa websockets.

El portal de trabajo no envía datos a través de una API REST convencional, sino que usa websockets para interactuar con el usuario.

Esto me resultó muy interesante.

¿Es posible rastrear el portal de trabajo K?-4

Por ello, al intentar copiar cookies y establecer una nueva conexión con bibliotecas como requests, fue imposible debido al proceso de handshake y manejo de sesión de los websockets.

Pero no podía rendirme aquí.

Decidí usar selenium-wire para examinar las solicitudes y respuestas realizadas a través del websocket.

# Iterar sobre las solicitudes
for request in driver.requests:
    if request.response:
        content_type = request.response.headers.get('Content-Type', '')
        if content_type.startswith('application/json'):
            print("== URL de Solicitud:", request.url)
            try:
                body = request.response.body.decode('utf-8', errors='ignore')
                print("== Contenido de Respuesta:", body)
            except Exception as e:
                print("== Error de Decodificación:", e)

driver.quit()

Entonces, aparecieron algunas letras que parecían estar codificadas en base64.

Intenté decodificarlas, pero fallé ya que no cumplían con el formato.

Aquí decidí dejarlo.

3. Conclusiones

Aunque me quejaba de la lentitud de los sitios de las instituciones públicas, después de investigar, parece que su seguridad está bien implementada.

No fue fácil obtener datos de forma remota, y aprendí mucho gracias a ello.

Sin embargo, creo que intentaré de nuevo en el futuro.

¿Es posible rastrear el portal de trabajo K?-5

댓글을 불러오는 중...