Web Scraping de Restaurantes Locales Usando la API de Ele.me con Python

Descripción del Ejrecicio

Este ejercicio se centra en aplicar conocimiantos de manejo de cookies y sesiones en Python para autenticarse en el sitio web de Ele.me y extraer una lista de restaurantes cercanos a una ubicación proporcionada.

Sitio web: https://www.ele.me/home/

Objetivos

  • Practicar el uso de cookies y setiones en Python.
  • Manejar solicitudes POST y GET mediante la biblioteca requests.
  • Analizar y extraer datos en formato JSON.
  • Implementar estrategias para evitar bloqueos de scraping.

Código de Ejemplo Modificado


import requests
import json

encabezados = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
}

def enviar_codigo_verificacion(telefono):
    url_envio = 'https://h5.ele.me/restapi/eus/login/mobile_send_code'
    datos_envio = {"mobile": telefono, "captcha_value": "", "captcha_hash": "", "scf": "ms"}
    respuesta = requests.post(url_envio, json=datos_envio, headers=encabezados)
    return respuesta.json().get('validate_token')

def iniciar_sesion(telefono, codigo, token):
    url_login = 'https://h5.ele.me/restapi/eus/login/login_by_mobile'
    datos_login = {"mobile": telefono, "validate_code": codigo, "validate_token": token, "scf": "ms"}
    respuesta = requests.post(url_login, json=datos_login, headers=encabezados)
    cookies_dict = requests.utils.dict_from_cookiejar(respuesta.cookies)
    with open('sesion_cookies.json', 'w', encoding='utf-8') as archivo:
        json.dump(cookies_dict, archivo)
    return respuesta.cookies

def verificar_sesion():
    try:
        with open('sesion_cookies.json', 'r', encoding='utf-8') as archivo:
            cookies_dict = json.load(archivo)
        cookies = requests.utils.cookiejar_from_dict(cookies_dict)
        if requests.get('https://www.ele.me/restapi/eus/v1/current_user?info_raw={}', headers=encabezados, cookies=cookies).json() == 0:
            raise Exception("Sesión inválida")
        return cookies
    except:
        telefono = input("Introduce tu número de teléfono: ")
        token = enviar_codigo_verificacion(telefono)
        codigo = input("Introduce el código de verificación de 6 dígitos: ")
        cookies = iniciar_sesion(telefono, codigo, token)
        return cookies

def obtener_coordenadas(ubicacion, cookies):
    url_posiciones = 'https://www.ele.me/restapi/v2/pois'
    parametros = {
        'extras[]': 'count',
        'geohash': 'wx4g0bmjetr7',
        'keyword': ubicacion,
        'limit': '20',
        'type': 'nearby',
    }
    respuesta = requests.get(url_posiciones, headers=encabezados, cookies=cookies, params=parametros)
    datos = respuesta.json()[0]
    return {
        'nombre': datos['name'],
        'latitud': datos['latitude'],
        'longitud': datos['longitude'],
        'geohash': datos['geohash']
    }

def listar_restaurantes(cookies):
    ubicacion = input("Introduce tu dirección: ")
    coordenadas = obtener_coordenadas(ubicacion, cookies)
    url_restaurantes = 'https://www.ele.me/restapi/shopping/restaurants'
    parametros = {
        'extras[]': 'activities',
        'geohash': coordenadas['geohash'],
        'latitude': str(coordenadas['latitud']),
        'longitude': str(coordenadas['longitud']),
        'limit': '10',
        'offset': '0',
        'terminal': 'web'
    }
    respuesta = requests.get(url_restaurantes, headers=encabezados, cookies=cookies, params=parametros)
    restaurantes = respuesta.json()
    for restaurante in restaurantes:
        print(restaurante['name'])

# Ejecución principal
sesion_cookies = verificar_sesion()
listar_restaurantes(sesion_cookies)

Ejemplo de Salida


Introduce tu dirección: Centro comercial
Restaurante A
Cafetería B
Pizzería C
...

Etiquetas: Python requests web-scraping json Cookies

Publicado el 7-7 02:10