preciosa, take 2

68 views
Skip to first unread message

Martín Gaitán

unread,
Jan 20, 2014, 9:56:30 PM1/20/14
to preciosa-devs
estimada gente:

como nati está de viaje durante algunas semanas, tengo más tiempo "ñoño" disponible. El domingo, en el supermercado, viendo a una señora anotando precios en una libretita, decidí que quiero retomar el proyecto porque me sigue pareciendo una buena idea (y, sobre todo, necesaria).

el plan de trabajo es humilde y considerandome a mí como único dev (más vale pájaro en mano, dijo el onanista).

Voy a revisar el modelado de la base que hicimos, pero antes de seguir con el scrapping y la importación de datos, quiero hacer una prueba de concepto del cliente usando phonegap.

tengo mucho que aprender, pero creo que es una herramienta adecuada porque son tecnologías comunes, tenemos plugin lector de codigos de barra [1] *, y el "phonegap build" [2] simplifica el multi empaquetado.

[1] https://build.phonegap.com/plugins/261
* sólo para android y ios :(
[2] https://build.phonegap.com/

si alguien tiene experiencia con este framework, agradeceré cualquier ayuda.

por supuesto, quien tenga ganas/tiempo, hay muchísimas cosas pendientes por hacer.

saludos
m.

Carlos

unread,
Feb 7, 2014, 3:45:48 PM2/7/14
to precio...@googlegroups.com
Hola Martín,

 Me parece muy interesante el proyecto. Tal vez puedo ayudar con algo de scraping. Estuve mirando el código y se me ocurrió que tal vez la parte de scraping (en el archivo tools/importador_sucursales.py) está demasiado "integrada" con django. En mi caso, aún reuniendo todas las dependencias necesarias, al querer probar tus scrapers desde la shell de django obtengo la excepción: "DoesNotExist: Cadena matching query does not exist."

Creo que para quienes no tienen mucha experiencia en django, como yo, sería más fácil si el scraping estuviera algo desacoplado (loose coupling). Como prueba de concepto, esta tarde te voy a enviar un pull request que sólo tiene un módulo de python nuevo, llamado "scraper.py". Dentro, sólo hay una clase, "HiperLibertad", que realiza el scraping de datos. Para obtener los datos sobre las sucursales del Híper Libertad desde cualquier otro módulo es tan simple como importar a scrapper e instanciar la clase.

Cuando tengas tiempo, fijate si te parece que así puede servir. Si te parece bien la idea, me pongo a escribir algunas clases más, para scraping del resto de los supermercados. En ese caso necesitaría tu feedback para algunos de los detalles, cuyas decisiones tomé arbitrariamente para este PoC.

Saludos!
CJ




El lunes, 20 de enero de 2014 23:56:30 UTC-3, Martín Gaitán escribió:
estimada gente:

como nati está de viaje durante algunas semanas, tengo más tiempo "ñoño" disponible. El domingo, en el supermercado, viendo a una señora anotando precios en una libretita, decidí que quiero retomar el proyecto porque me sigue pareciendo una buena idea (y, sobre todo, necesaria).

el plan de trabajo es humilde y considerandome a mí como único dev (más vale pájaro en mano, dijo el onanista).

Voy a revisar el modelado de la base que hicimos, pero antes de seguir con el scrapping y la importación de datos, quiero hacer una prueba de concepto del cliente usando phonegap.

tengo mucho que aprender, pero creo que es una herramienta adecuada porque son tecnologías comunes, tenemos plugin lector de codigos de barra [1] *, y el "phonegap build" [2] simplifica el multi empaquetado.

* sólo para android y ios :(

Martín Gaitán

unread,
Feb 7, 2014, 3:55:08 PM2/7/14
to Carlos, preciosa-devs
Carlos,

un gusto que te sumes.

respecto al código de scrapping de sucursales, efectivamente es un pequeño desastre. Son "hacks" que voy armando interactivamente: los dejo por si a futuro sirven, pero ahora sólo busco los datos lo más prolijo y "barato" posible.

Así que la respuesta es sí: sirve perfectamente que un código no acoplado a Django, en cualquier lenguaje, que permita generar un fixture (por ejemplo en Json) de sucursales de una (o varias) cadenas de super.

Los datos importantes son "nombre, ciudad, direccion" (si puese posible, provincia, telefonos y otros datos)

Leer ese json y pasarlo a "django" (dandole ID y demás) es trivial.

avanti y muchas gracias por sumarte.
martin


--
Has recibido este mensaje porque estás suscrito al grupo "Preciosa" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a preciosa-dev...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



--

Martín V

unread,
Feb 12, 2014, 7:03:43 PM2/12/14
to precio...@googlegroups.com
Hola Martín

Me interesa el proyecto ya que es muy similar a una idea que tuve hace tiempo y quedó en la nada. Estoy empezando a desarrollar en Android, pero aplicaciones nativas, usando el SDK de Google. Voy a seguir leyendo el avance del proyecto para ver si puedo dar una mano con algo.

Suerte

Martín.



El lunes, 20 de enero de 2014 23:56:30 UTC-3, Martín Gaitán escribió:

Santi Vallazza

unread,
Sep 19, 2016, 4:12:40 PM9/19/16
to Preciosa
Buenas!

Justo iba a mandar un mail preguntando por los scrappers, pero antes me puse a buscar qué había.
Iba a preguntar si era posible probar los scrappers sin levantar preciosa.
Quería ver si armaba algo sobre PreciosClaros.

Este hilo me aclaró bastante.
Carlos, subiste ese Scraper.py?

Leí la documentación en ReadTheDocs pero no encontré info técnica sobre base de datos, algoritmos, scrap
 * http://preciosa.readthedocs.io/es/latest/

Estuve leyendo este hilo,  y este código de CotoDigital, y veo como arma la respuesta luego de relevar datos de productos, pero me vendrìa bien ver algo de documentaciòn para saber qué datos levantar y como agruparlos.
 * https://groups.google.com/forum/#!searchin/preciosa-devs/scrapper|sort:relevance/preciosa-devs/4pGU-yPFyZk/GCaTCt97pPsJ
 * https://github.com/mgaitan/preciosa/blob/36dbb4bddce9ded49654137d584c2d67f6ca7f02/preciosa/datos/management/commands/coto.py

Puedo ir aportando a la documentación?
por ejemplo: Cómo aportar información en CSV o JSON para ser levantada por preciosa.

Saludos!
Santiago

Martín Gaitán

unread,
Sep 20, 2016, 12:06:45 AM9/20/16
to Santi Vallazza, Preciosa
2016-09-19 17:12 GMT-03:00 Santi Vallazza <rulo...@gmail.com>:
Estuve leyendo este hilo,  y este código de CotoDigital, y veo como arma la respuesta luego de relevar datos de productos, pero me vendrìa bien ver algo de documentaciòn para saber qué datos levantar y como agruparlos.
 * https://groups.google.com/forum/#!searchin/preciosa-devs/scrapper|sort:relevance/preciosa-devs/4pGU-yPFyZk/GCaTCt97pPsJ
 * https://github.com/mgaitan/preciosa/blob/36dbb4bddce9ded49654137d584c2d67f6ca7f02/preciosa/datos/management/commands/coto.py

Puedo ir aportando a la documentación?
por ejemplo: Cómo aportar información en CSV o JSON para ser levantada por preciosa.


 Santi, buenisimo, toda colaboración tendiente a facilitar la colaboración de voluntarios es bienvenida y necesaria, asi que adelante con todo lo que puedas hacer en la documentación. Andá consultando por acá que también es una manera de generar y sistematizar contenido. 

Acá encontré un hilo donde menciono algo al respecto

en general, los scrappers se desarrollaron "a la que te criaste", con la intención, justamente, de permitir que se pudieran desarrollar en cualquier lenguaje. Como el despiole ya se hacia insostenible, comencé ese código de "adaptadores" que mapean las columnas de los csv a los modelos django de preciosa. 


Entonces, por ejemplo, un csv de "productos" que tiene estas columbas

PRODUCTO_COLS = ['id',           # opcional
                 'upc',          # req
                 'descripcion',  # req
                 'marca',        # opcional. La marca "probable" como nombre
                 'marca_id',     # opcional. si es conocida, el id de la marca
                 'categoria',    # opcional. La categoria "probable" como nombre
                 'categoria_id',    # opcional. si es conocida, el id de la marca
                 'contenido',    # opcional, numero
                 'unidad_medida',   # opcional. Producto.UNIDADES_CHOICES
                 'unidades_por_lote',   # opcional: cuantos productos
                                        #vienen en un pack mayorista
                 'id_online',   # opcional, algun identificador en el sitio online
                                # de la cadena
                 'oculto',      # opcional.default: false
                 'foto',        # opcional  path relativo, relativo al csv o url
                                # de un thumbnail del producto
                 ]


tiene "adaptador" llamado "producto", y se invoca así

$ python manage.py import_csv producto <path o url al csv>


bastante piola, pero hay pasos intermedios: por ejemplo, hay que saber el "id_sucursal" (los sitios online están modelados como una sucursal más de la cadena, solo diferenciados con un booleano) y, sobre todo, conocer el upc/ean (codigo de barra) de cada producto, que es el indentificador universal. Para los casos donde el propio sitio usa el codigo de barra como id de cada producto es un problema menos, pero la mayoria de los sitios usa un id interno propio, para lo cual desarrollamos algunas heuristicas basasdas en las categorias/marcas del producto para tratar de identificarlo univocamente en nuestra base de productos. 

En esto colaboró un montón Java Lopez, desarrollando Annalisa 



Si lograbamos identificar el producto, esta "traduccion" (del id online para ese producto y cadena) se almacena en un modelito de preciosa, que luego se usa en la importación


Creo que seria bueno documentar más claramente esto como puntapié para recuperar los scrappers (a los que asumo totalmente rotos/descartables luego de mas de 2 años). 

No obstante, tambien creo que si empezamos a hacer scrapper nuevos (en python) deberiamos usar algo más robusto como scrapy  
+ scrapy-djangoitem y correrlo en https://scrapinghub.com , de manera de sacarnos algo de trabajo de encima. 

Respecto al scrapper de precios claros, tengo algo empezado basado en el post que compartiste anteriormente [1], mañana mando una muestra. 

De acá saldrán algunas subtareas que hay que resolver, como mapear las sucursales (y cargar las que no tengamos)

saludos!


Reply all
Reply to author
Forward
0 new messages