Scrapping de Mercadolibre con Python utilizando su API pública

En el trabajo hace unos días nos surgió la necesidad de presentar en un mapa cierto tipo de publicaciones, ya que uno de nuestros equipos estaba buscando locales para expandirnos. Así es cómo me encomendaron la tarea de obtener información de varios sitios y dejarlos disponibles en nuestro software de mapeo.

Hoy vamos a ver cómo obtener datos de publicaciones de mercadolibre, para su posterior utilización.

Mercadolibre nos provee de manera pública una url con una api REST lista para usar. La API de mercadolibre devuelve resultados en formato .json,

En este ejemplo vamos a desarrollar una búsqueda por categoría, y no por consulta, además, solo buscaremos las publicaciones que se realizaron ese día.

Empecemos.

La url de mercadolibre es la siguiente:
https://api.mercadolibre.com/sites/MLA/search?category=MLA79242&_PublishedToday_YES
Analicemosla un poco

https://api.mercadolibre.com/sites/MLA/search?category=MLA79242&_PublishedToday_YES

Es la url principal, para identificarla del sitio general, no comienza con www sino que comienza con api.

https://api.mercadolibre.com/sites/MLA/search?category=MLA79242&_PublishedToday_YES

Este código de categoría específicamente es para Locales (tanto alquiler como venta).

https://api.mercadolibre.com/sites/MLA/search?category=MLA79242&_PublishedToday_YES 

Un filtro de mercadolibre que filtra solo los publicados hoy.

Estos filtros y otros dos que utilizaremos en este tutorial, incluyendo los códigos de categorías, etc, se pueden conseguir jugando con el sitio común de mercadolibre y agregandole filtros, luego verificando la url generada podemos inferir lo que necesitemos.

Por ejemplo si quisiera ver Celulares, necesito conseguir el código de categoría correspondiente, y eso lo hago en dos pasos:

Una vez cargada la página, inspeccionamos el HTML del sitio buscando “category”

Vamos a encotnrar algo asi:

Y asi sabemos que el codigo de categoría es MLA1051

Una vez obtenida esta información, podemos armar la url.


Arquitectura del scrapper

Vamos a armar minimo dos clases, una clase “categoría”, que va a tener dentro informacion propia de la categoria, incluyendo el método adaptar, que adapta los datos de la url al formato de esa categoría.

Una segunda clase será la de mercadolibreAPI, facilitandonos asi la operacion de busqueda, etc.

Antes de seguir, estas son las librerías de python que vamos a utilizar:


Empecemos a armar nuestra clase, cómo esta clase va a aceptar objetos categoría, tenemos que crear el método acorde que permita agregarselo, y también agreguemos la búsqueda.

Vamos paso a paso.
def request_get(self, url): lee y descarga utilizando la librería  requests de python.
def search(self): Primero armamos la url utilizando propiedades del objeto agregado en
ml.search_config(inmueble) (ya vamos a ver en detalle ese objeto), luego ejecutamos la consulta REST, y le pedimos que nos devuelva el valor del elemento ‘paging’ y dentro de ese elemento le pedimos el valor ‘total’, si vas a la dirección desde el navegador, vas a verlo representado como en este ejemplo:

 
paginators = round(self.request_get(url)['paging']['total']/50)+1 la consulta que hacemos a la api pide 50 resultados por vez, y lo que vamos a ir haciendo es mover el offset de a 50, así, la primer consulta pide del 0 al 50, la segunda del 50 al 100, etc.

Una vez conocida la cantidad de consultas que debemos realizar, hacemos un for y rearmamos la url para solicitar (offset=??). Vamos agregando los elementos de cada consulta al atributo “items” de la clase, que contiene todos los elementos que luego vamos a procesar.
def adapt(self): Solo llama al método de la clase categoría.


Analicemos ahora la clase “inmueble”

Estas columnas son las columnas de salida que definí necesitaba para el modelo pueden cambiar para el tuyo, y seguramente cambiaran para cada categoría.
def adapt(self, items): recibe una lista de resultados json para procesar

Transformamos los resultados recibidos en un dataframe de pandas, y luego eliminamos los duplicados.


Este es el resultado final:

 

Dejá una respuesta