Descarga el HTML renderizado de la pagina de DiDi Food McDonalds para una direccion especifica. Usar cuando el usuario pida descargar, scrapear o bajar el HTML de DiDi para un numero de direccion (1-20). Lee la direccion automaticamente de /home/jlzdz/direcciones.json.
Copia este script, reemplaza NUMERO con el numero real, y ejecutalo. NO lo modifiques excepto NUMERO:
import json, time
from playwright.sync_api import sync_playwright
N = NUMERO
with open('/home/jlzdz/direcciones.json') as f:
dirs = json.load(f)
addr = dirs[str(N)]['address']
print(f'Direccion {N}: {addr}')
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp('http://127.0.0.1:9222')
context = browser.contexts[0]
page = context.pages[0]
# PASO 1: Navegar a DiDi Food y ESPERAR 8 SEGUNDOS
print('Navegando a DiDi Food...')
page.goto('https://www.didi-food.com/es-MX/food/', timeout=30000)
page.wait_for_timeout(8000)
print('Pagina cargada')
# PASO 2: Clic en el selector de direccion (parte superior izquierda)
# Esta al lado del logo de DiDi Food, tiene un icono de ubicacion y un texto con la direccion actual
print('Buscando selector de direccion...')
addr_btn = page.locator('header [class*="address"], header [class*="location"], [data-testid*="address"]').first
if addr_btn.count() == 0:
# Buscar por el icono de ubicacion o texto de direccion en el header
addr_btn = page.locator('header >> text=/Avenida|Calle|Calzada|Dir/').first
if addr_btn.count() == 0:
# Ultimo recurso: buscar cualquier elemento clickeable con texto de direccion en la parte superior
addr_btn = page.locator('[class*="Header"] >> [class*="ddress"]').first
addr_btn.click()
print('Selector clickeado, esperando modal...')
page.wait_for_timeout(6000)
# PASO 3: Escribir la direccion en el campo "Ingresa una direccion"
print('Buscando campo de texto...')
input_field = page.locator('input[placeholder*="Ingresa"], input[placeholder*="direcci"], input[placeholder*="busca"], input[type="text"]').first
input_field.click()
page.wait_for_timeout(1000)
input_field.fill('')
page.wait_for_timeout(500)
input_field.type(addr, delay=50)
print(f'Direccion escrita: {addr}')
page.wait_for_timeout(4000)
# PASO 4: Clic en el primer resultado de la lista de sugerencias
print('Buscando sugerencias...')
suggestion = page.locator('[class*="suggestion"], [class*="result"], [class*="option"], [class*="item"], [class*="list"] >> [class*="row"], [role="option"]').first
if suggestion.count() > 0:
suggestion.click()
else:
# Intentar con el primer elemento de texto debajo del input
page.keyboard.press('ArrowDown')
page.wait_for_timeout(500)
page.keyboard.press('Enter')
print('Sugerencia seleccionada')
page.wait_for_timeout(4000)
# PASO 5: Agregar detalles - poner nombre en empresa/departamento
# DiDi pide agregar detalles a la direccion. Hay un campo de nombre de empresa/departamento.
print('Buscando campo de empresa/departamento...')
detail_fields = page.locator('input[placeholder*="empresa"], input[placeholder*="Empresa"], input[placeholder*="departamento"], input[placeholder*="Nombre"], input[placeholder*="nombre"]')
if detail_fields.count() > 0:
detail_field = detail_fields.first
detail_field.click()
detail_field.fill(f'casa{N}')
print(f'Nombre empresa/depto: casa{N}')
page.wait_for_timeout(1000)
else:
# Buscar cualquier input vacio visible en el modal
visible_inputs = page.locator('input[type="text"]:visible')
for i in range(visible_inputs.count()):
inp = visible_inputs.nth(i)
if inp.input_value() == '':
inp.fill(f'casa{N}')
print(f'Campo vacio encontrado, llenado con casa{N}')
break
# PASO 6: Clic en Confirmar
print('Buscando boton confirmar...')
confirm_btn = page.locator('button:has-text("Confirmar"), button:has-text("confirmar"), button:has-text("Guardar"), button:has-text("Continuar")').first
if confirm_btn.count() > 0:
confirm_btn.click()
print('Confirmado')
page.wait_for_timeout(10000)
print('Direccion cambiada, pagina recargada')
# PASO 7: Buscar "Big mac" en el buscador
print('Buscando campo de busqueda...')
search_field = page.locator('input[placeholder*="Buscar"], input[placeholder*="buscar"], input[placeholder*="restaurante"], input[placeholder*="comid"], input[type="search"]').first
search_field.click()
page.wait_for_timeout(1000)
search_field.fill('')
search_field.type('Big mac', delay=80)
print('Busqueda: Big mac')
page.wait_for_timeout(1000)
page.keyboard.press('Enter')
page.wait_for_timeout(5000)
# PASO 8: Buscar McDonalds en los resultados y hacer clic
print('Buscando McDonalds en resultados...')
mcdonalds = page.locator('text=/McDonald/i').first
if mcdonalds.count() > 0:
mcdonalds.click()
print('McDonalds encontrado y clickeado')
else:
# Si no aparece directamente, buscar en cards/tiles de restaurantes
cards = page.locator('[class*="card"], [class*="store"], [class*="restaurant"], [class*="shop"]')
for i in range(cards.count()):
card_text = cards.nth(i).text_content()
if card_text and 'mcdonald' in card_text.lower():
cards.nth(i).click()
print(f'McDonalds encontrado en card {i}')
break
page.wait_for_timeout(4000)
# PASO 9: Screenshot
page.screenshot(path=f'/home/jlzdz/didi_{N}.png')
print(f'Screenshot guardado: didi_{N}.png')
# PASO 10: Guardar HTML
html = page.content()
with open(f'/home/jlzdz/didi_{N}.html', 'w', encoding='utf-8') as f:
f.write(html)
print(f'HTML guardado: didi_{N}.html ({len(html)//1024} KB)')
print('Completado!')