Api-Meli, Primeros pasos.

G. Balonga
5 min readApr 26, 2021

--

Ya hace un tiempo vi la charla (https://www.youtube.com/watch?v=0zZ9Poyywq4) de Daniel Rabinovich, actual COO de MercadoLibre. Donde cuenta como repensaron MercadoLibre y aperturaron la plataforma. Como en vez de generar un backdoor a la plataforma para developers, desarrollaron una API que toda la compañía usa para interactuar con el sitio en distintos niveles.

La API es sencilla de usar y utiliza los métodos Std, por lo que no hay que recurrir a documentación especifica, a su vez todos los llamados son a la misma API por lo que no hay que estar cambiando “a quien” le vamos a estar preguntando que cosa, segun lo que necesitemos.

Todos los recursos los pueden ver en el siguiente link:

Con la introducción hecha, les comparto algunos ejemplos que realice para probar funcionalidades y el grado de apertura de la API, sin necesidad de tokens.

TRENDS.

El primer código:

  • Consulta los elementos mas buscados del día anterior
  • Elegimos el mas buscado y le pedimos los ítems de esa búsqueda.
  • Seleccionamos el mas relevante y pedimos los datos
Esquemático

A nivel consultas los pedidos se realizan de la siguiente manera:

Trends: https://api.mercadolibre.com/trends/MLA

Keyword Search: https://api.mercadolibre.com/sites/MLA/search?q= + KEYWORD

Item: https://api.mercadolibre.com/items/ + IdItem

El search es una de las funciones particulares de la API, que nos devuelve los ítems pertenecientes a la categoria donde hacemos la busqueda. Como por ejemplo:

Tomemos la categoría MLA2547 — Entradas para Eventos.

Si realizamos el request de la siguiente manera:

https://api.mercadolibre.com/categories/MLA2547

Obtenemos como resultados, los atributos particulares a esa categoria:

{
"id": "MLA2547",
"name": "Entradas para Eventos",
"picture": "http://resources.mlstatic.com/category/images/537b9145-ac07-43ec-a281-b5bdb442192c.png",
"permalink": "https://www.mercadolibre.com.ar/c/entradas-para-eventos",
"total_items_in_this_category": 3083,
"path_from_root": [],
"children_categories": [],
"attribute_types": "attributes",
"settings": {},
"channels_settings": [
],
"meta_categ_id": null,
"attributable": false,
"date_created": "2018-04-25T08:12:56.000Z"
}

Mientras que si realizamos el siguiente pedido:

https://api.mercadolibre.com/sites/MLA/search?category=MLA2547

Obtenemos como resultado, la lista de los primeros 50 items de esa categoría:

{
"site_id": "MLA",
"paging": {},
"results": [],
"secondary_results": [
],
"related_results": [
],
"sort": {},
"available_sorts": [],
"filters": [],
"available_filters": []
}

Esto es particularmente importante, considerando que uno puede buscar los artículos mas relevantes de una categoría, que serán distintos a los artículos mas relevantes de una categoría “children” de la misma.

Por ultimo el código:

import requests
import json

def jprint(obj):
# pretty print json
text = json.dumps(obj, indent=4)
print(text)

#Hago el request de los trends del dia (Multiples categorias)
rq= requests.get("https://api.mercadolibre.com/trends/MLA")

for i in range(10):
print(rq.json()[i]["keyword"])


#Elijo uno de los trends y hago la busqueda particular del mismo (Multiples Articulos)
indice = rq.json()[0]["keyword"]
print(indice)
busqueda = "https://api.mercadolibre.com/sites/MLA/search?q=" + indice

rq2= requests.get(busqueda)

print(rq2.json()["results"][0])

#Elijo alguno en especial (Articulo especifico)

articulo = rq2.json()["results"][0]["id"]
busqueda = "https://api.mercadolibre.com/items/" + articulo
rq3= requests.get(busqueda)
#Info del articulo final
jprint(rq3.json())

En este caso, como busco entre lo más buscado el primer articulo que aparece, lo que finalmente encuentro, es el articulo que mas veces se listo en el día anterior.

Buscando nichos.

En el segundo ejemplo:

  • Buscaremos dentro de todas las categorías principales de Meli
  • Generaremos un Dataframe con esta información y luego de ordenar, veremos cual es la categoría con menor cantidad de ítems.
  • Pediremos la lista de subcategorías ([“”children_categories”]), eligiremos una (en este caso no la menor, para que el ejercicio tenga diversidad).
  • Sacaremos info promedio de la subcategoría, mediante la info de cada uno de los artículos.
  • Por ultimo, tomaremos el articulo mas relevante y guardaremos su primer imagen.

El codigo:

import requests
import json
import pandas as pd
from collections import Counter

def jprint(obj):
obj = obj.json()
text = json.dumps(obj, indent=4)
print(text)


#Pedimos la lista de categorias
rq= requests.get("https://api.mercadolibre.com/sites/MLA/categories")

#El get de categorias no me dice la cantidad en cada una, por lo que debo entrar a todas y consultarlo puntualmente
df = pd.DataFrame ()

for i in rq.json():
categoria = "https://api.mercadolibre.com/categories/" + i["id"]
rq2 = requests.get(categoria)
nombre = rq2.json()["name"]
cantidad = rq2.json()["total_items_in_this_category"]
id = i["id"]
df = df.append({"nombre": nombre, "id": id, "cantidad":cantidad},ignore_index=True)

df = df.sort_values(by=["cantidad"],ascending = True, ignore_index=True)
print("Data frame con todo")
print(df)

print(f'Resultado a buscar {df.loc[0]["id"]} {df.loc[0]["nombre"]}')

#Esta es la categoria con menos productos
catelegida = "https://api.mercadolibre.com/categories/" + df.loc[0]["id"]
rq3 = requests.get(catelegida)


infojson = rq3.json()["children_categories"]
#En este caso la info de cantidades ya esta, por lo que no tengo que entrar a cada Subcategoria en particulardf2= pd.DataFrame(infojson)
df2 = df2.sort_values(by=["total_items_in_this_category"],ascending = True, ignore_index=True)
print(f'Las subcategorias son'
f' {df2}')

listadeproductos = "https://api.mercadolibre.com/sites/MLA/search?category=" + df2.loc[1]["id"]
rq4 = requests.get(listadeproductos)


n = 0
precio = 0
MP = 0
shipping = [] #Lista que va agregando los tipos de envio, luego se contaran con la libreria Counter
print(f''
f' Los articulos dentro de la subcategoria {df2.loc[1]["name"]} son')
for i in rq4.json()["results"]:
n = n +1
print(f'Resultado numero {n} articulo : {i["id"]}')

#Juego con atributos
precio = i["price"] + precio
if i["accepts_mercadopago"] == True : MP = MP + 1
shipping.append(i["shipping"]["logistic_type"])

print("* * * * * * * * * * *")
print(f'Info general de la subcategoria: {df2.loc[1]["name"]} ')
print(f'El precio promedio de los articulos es {int(precio/n)}')
print(f'El porcentaje de articulos que aceptan MercadoPago es {MP/n*100}%')
contador = Counter(shipping)
print(f'Los tipos de envios son {contador}')


#le digo cual es el articulo mas relevante, le pido la info de ese articulo.
ArtRelevante= rq4.json()["results"][0]["id"]
rq5 = requests.get("https://api.mercadolibre.com/items/" + ArtRelevante)
#Con el http de la foto, hago un request por esa foto y la guardo

rq6= requests.get(rq5.json()["pictures"][0]["url"])
if rq6.status_code == 200:
with open("img.jpg", 'wb') as f:
f.write(rq6.content)

El resultado:

Como resultado, tenemos que de todas las categorías, la de “entradas para eventos”, es la de menor cantidad de ítems (#Covid) .

Dentro de los eventos, la de menor cantidad es “eventos a beneficio”, sin embargo usamos “eventos deportivos”, para probar el programa.

Dentro de eventos deportivos:

  • 33 artículos.
  • Precio promedio 17350 pesos.
  • El 100% de los artículos aceptan MercadoPago.
  • El shipping esta dado por [drop_off’: 23, ‘xd_drop_off’: 6, ‘not_specified’: 4]
  • Se guardo la imagen del objeto mas relevante. (“Entrada Boxeo Amateur — Fab — Olimpiadas Sidney 2000 — Usada-”)

Conclusiones.

Muchas de las cosas realizadas, no fueron optimizadas para estar en producción, si no como análisis de uso y practica. Existe toda una sección de filtros y ordenamiento que optimiza los tiempos de respuesta de la API, entregando la info necesaria y no el crudo de la misma.

De estas pruebas, se puede obtener el camino para un sin fin de operaciones. Se me ocurren algunos como:

  • Establecer el mejor precio de un producto a publicar, mediante el análisis de la categoría.
  • Armar una base de fotos para entrenar IA y que te clasifique un producto por foto.
  • Generar mapas, donde segmente los productos más ofrecidos según zona.
  • Análisis de tipo de envió mas común por categoría.

Espero que haber compartido, mis notas y pruebas sobre el uso de la API de Meli, les haya sido de alguna manera útil.

--

--