¿Cómo convertir un pequeño bot en un servicio REST?

Ver bots en acción en mi Portafolio
Repositorio en GitHub
Demo del endpoint en Railway 🚀 (ejecución en tiempo real: 30 seg. aprox. para generar el resultado JSON).

results

🧩 Parte 1 – Construyendo el bot con Selenium y Python


page_katro.py – Definición de elementos de la página Ktronix


from selenium.webdriver.common.by import By

class KatroHome:
    cel = (By.XPATH,"(//a[@title='Celulares'])[1]")
    celu = (By.XPATH,"//a[@data-subcategory='Celulares']")
    notifi = (By.XPATH,"//button[@class='button-primary js-cookie-notification-accept']")

class KatroCell:
    order = (By.XPATH,"//div[@class='float-select js-float-select js-float-group full-width active-click']")
    menor = (By.XPATH,"//li[contains(.,'Precio: menor a mayor')]")

    @staticmethod
    def val_element(val):
        return (By.XPATH, f"(//span[contains(@class,'price')])[{val}]")

  

actions.py – Métodos reutilizables para acciones sobre la página


import time
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

class Actions:

    @staticmethod
    def open_url(driver, url):
        driver.get(url)

    @staticmethod
    def move_to_element(driver, selector):
        acciones = ActionChains(driver)
        elementMove = driver.find_element(*selector)
        acciones.move_to_element(elementMove).perform()
  

appExecution.py – Script principal que integra páginas y acciones


from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from unidecode import unidecode
from page_katro import *
from actions import *


def createDriver() -> webdriver.Chrome:
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")    
    chrome_options.add_argument("user-agent=Chrome/100.0.1000.0")
    prefs = {"profile.managed_default_content_settings.images":2}
    chrome_options.headless = True
    chrome_options.add_experimental_option("prefs", prefs)
    myDriver = webdriver.Chrome(options=chrome_options)
    # Alternativa con webdriver_manager si no tienes chromedriver instalado:
    # from webdriver_manager.chrome import ChromeDriverManager
    # from selenium.webdriver.chrome.service import Service 
    #myDriver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
    return myDriver
  
def getBotSearchOffer(driver: webdriver.Chrome) -> str:
    Actions.set_window_position(driver, 0, 0)
    Actions.set_window_size(driver, 1496, 1024)
    data ={}
    referencia = []
    valor =[]
    Actions.open_url(driver, "https://www.ktronix.com/")
    Actions.wait(5)
    Actions.move_to_element(driver, KatroHome.cel)
    Actions.wait(5)
    Actions.click_element(driver, KatroHome.celu)  
    Actions.wait(3)  
    Actions.if_click_element(driver, KatroHome.notifi) 
    Actions.scroll_to(driver,751,631)
    Actions.wait(3) 
    Actions.click_element(driver, KatroCell.order) 
    Actions.click_element(driver, KatroCell.menor)
    Actions.wait(5)  
    valPrice=1
    for i in range(3) :
        valRef=str(i+1)
        ref = Actions.get_text(driver, KatroCell.ref_element(valRef))
        val = Actions.get_text(driver, KatroCell.val_element(str(valPrice)))
        referencia.append(ref)
        valor.append(val)
        valPrice+=2
    data['Ktronix']=[referencia, valor]
    return(data)
  

🧩 Parte 2 – Llevando el bot a un servicio REST con FastAPI

appExecution.py – Script principal que integra páginas y acciones


from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from appExecution import *
from fastapi.responses import HTMLResponse, JSONResponse

app = FastAPI()

# Orígenes permitidos (ajusta según tu dominio)
origins = [
    "https://tu-dominio.com"  # Cambia este dominio por el tuyo
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # Si quieres restringir, reemplaza con: origins
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

class Msg(BaseModel):
    msg: str
    secret: str

@app.get("/")
async def root():
    with open("index.html", "r") as file:
        html_content = file.read()
    return HTMLResponse(content=html_content, status_code=200)

@app.get("/botSearchOffer")
async def demo_get():
    driver = createDriver()
    listOffers = getBotSearchOffer(driver)
    driver.quit()
    return JSONResponse(content={"listOffer": listOffers})
  

🧩 Parte 3 – Desplegando en Railway – Llevando el bot a producción

Ejemplo de Salida en JSON


    {"listOffer":
      "Ktronix":         
         [
            ["KALLEY"],
            ["KALLEY"],
            ["ZTE"]
         ],
         [
            ["$239.900"],
            ["$239.900"],
            ["$269.900"]
         ]    
    }
  

📊 Ejemplo de resultados

results search


Bots en mi Portafolio
Repositorio
Demo del endpoint (30 segundos aprox.)
Avatar photo
Paola Lozada

Leave a Reply

Your email address will not be published. Required fields are marked *