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
...