From 30b4b33ec73a80e854506c6744ed93d3c2eed30d Mon Sep 17 00:00:00 2001 From: claude Date: Sun, 2 Aug 2026 18:05:29 +0200 Subject: [PATCH] feat: DAG diario Metrocuadrado CO --- dags/metrocuadrado_co_daily.py | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 dags/metrocuadrado_co_daily.py diff --git a/dags/metrocuadrado_co_daily.py b/dags/metrocuadrado_co_daily.py new file mode 100644 index 0000000..889ab69 --- /dev/null +++ b/dags/metrocuadrado_co_daily.py @@ -0,0 +1,56 @@ +"""DAG diario – Metrocuadrado CO (Colombia) +Scraper RSC-based que itera categorías × ciudades × barrios. +""" +from datetime import datetime, timedelta +import paramiko + +from airflow import DAG +from airflow.operators.python import PythonOperator + +VPS_HOST = '152.53.242.31' +VPS_USER = 'root' +VPS_KEY = '/opt/airflow/config/.ssh/id_rsa' + +SCRAPER_CMD = ( + 'METRO_DAILY=1 ' + 'timeout 18000 ' + '/home/jpuma/proyectos/bot-sunat/.venv/bin/python ' + '/opt/scrapers/metrocuadrado_co/scraper.py 2>&1' +) + +def run_scraper(**ctx): + client = paramiko.SSHClient() + client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + client.connect(VPS_HOST, username=VPS_USER, key_filename=VPS_KEY, timeout=30) + _, stdout, stderr = client.exec_command(SCRAPER_CMD, timeout=18000) + output = stdout.read().decode('utf-8', errors='replace') + err = stderr.read().decode('utf-8', errors='replace') + client.close() + print(output[-4000:] if len(output) > 4000 else output) + if err: + print('STDERR:', err[-500:]) + if 'Finalizado:' not in output: + raise RuntimeError('Scraper no imprimió "Finalizado:" — posible error') + return output.split('Finalizado:')[-1].strip() + + +default_args = { + 'owner': 'jpuma', + 'retries': 0, + 'execution_timeout': timedelta(hours=6), +} + +with DAG( + dag_id='metrocuadrado_co_daily', + default_args=default_args, + description='Scraper diario Metrocuadrado CO (RSC Next.js)', + schedule_interval='0 5 * * *', + start_date=datetime(2026, 8, 1), + catchup=False, + max_active_runs=1, + tags=['colombia', 'daily', 'inmuebles'], +) as dag: + PythonOperator( + task_id='scrape_metrocuadrado_co', + python_callable=run_scraper, + )