57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
"""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,
|
||
)
|