From c217161d21e30742ec31d7273497d1a099584424 Mon Sep 17 00:00:00 2001 From: Nulo Date: Wed, 27 Dec 2023 19:55:08 -0300 Subject: [PATCH] =?UTF-8?q?documentaci=C3=B3n=20b=C3=A1sica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixes #4 --- .vscode/settings.json | 4 ++++ db-datos/drizzle.config.ts | 6 ++--- readme.md | 42 +++++++++++++++++++++++++++++++++++ sitio/src/lib/server/db.ts | 2 +- sitio/src/routes/+page.svelte | 6 ++--- 5 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 readme.md diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..d273bf6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "spellright.language": ["es_AR"], + "spellright.documentTypes": ["markdown", "latex", "plaintext"] +} diff --git a/db-datos/drizzle.config.ts b/db-datos/drizzle.config.ts index 42a2a85..058b309 100644 --- a/db-datos/drizzle.config.ts +++ b/db-datos/drizzle.config.ts @@ -1,13 +1,11 @@ import type { Config } from "drizzle-kit"; -if (!process.env.DB_PATH) throw new Error("no hay DB_PATH"); - -export const DB_PATH = process.env.DB_PATH; +export const DB_PATH = process.env.DB_PATH ?? "../scraper/sqlite.db"; export default { schema: "./schema.ts", out: "./drizzle", dbCredentials: { - url: process.env.DB_PATH, + url: DB_PATH, }, } satisfies Config; diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..f7138b4 --- /dev/null +++ b/readme.md @@ -0,0 +1,42 @@ +# preciazo + +scrapeo "masivo" de precios y datos en supermercados argentinos + +## componentes (en orden de proceso) + +- los link scrapers ([coto-link-scraper](./coto-link-scraper/), [dia-link-scraper](./dia-link-scraper/) y [userscripts/carrefour.js](./userscripts/carrefour.js)) crean listas de links a productos para scrapear + + (no hace falta correrlos porque ya hay listas armadas en [data/](./data/)) + +- se usa wget (potencialmente reemplazado por algo custom en el futuro) que genera un archivo [WARC](https://iipc.github.io/warc-specifications/specifications/warc-format/warc-1.0/) con todas las paginas de productos +- el [scraper](./scraper/) procesa estos WARCs, extrayendo varios datos y guardandolos en una base de datos SQLite (definida en [db-datos](./db-datos/schema.ts)) +- el [sitio](./sitio/) renderiza páginas a partir de la base de datos y hace gráficos lindos + +## setup + +hay que instalar [Bun](https://bun.sh/), que lo estoy usando porque hacía que el scraper corra más rápido. quizás en el futuro lo reemplace con good old Node.js. + +aparte, se necesita zstd, que se usa para comprimir los WARCs eficientemente. seguro está disponible en las repos de tu distro favorita :) + +empezá descargando un WARC con 50 páginas de sample, y recomprimilo con zstd: + +``` +wget --no-verbose --tries=3 --delete-after --input-file ./data/samples/Dia.txt --warc-file=dia-sample +gzip -dc dia-sample.warc.gz | zstd --long -15 --no-sparse -o dia-sample.tar.zst +``` + +después, scrapealo a una BD: + +``` +cd scraper/ +bun install +bun cli.ts scrap ../dia-sample.tar.zst +``` + +ahora miralo en el sitio: + +``` +cd sitio/ +bun install +bun --bun dev +``` diff --git a/sitio/src/lib/server/db.ts b/sitio/src/lib/server/db.ts index c15c0f0..7462d9c 100644 --- a/sitio/src/lib/server/db.ts +++ b/sitio/src/lib/server/db.ts @@ -3,7 +3,7 @@ import { drizzle } from "drizzle-orm/bun-sqlite"; import * as schema from "db-datos/schema.js"; import { env } from "$env/dynamic/private"; -const sqlite = new Database(env.DB_PATH); +const sqlite = new Database(env.DB_PATH ?? "../scraper/sqlite.db"); export const db = drizzle(sqlite, { schema }); export * as schema from "db-datos/schema.js"; diff --git a/sitio/src/routes/+page.svelte b/sitio/src/routes/+page.svelte index ca5d611..b3eef74 100644 --- a/sitio/src/routes/+page.svelte +++ b/sitio/src/routes/+page.svelte @@ -15,9 +15,9 @@
  • - Sopa Instantánea KNORR QUICK Zapallo Romero Sobres 5 Un. + + Sopa Instantánea KNORR QUICK Zapallo Romero Sobres 5 Un. +
  • Agua Saborizada Levité Pera 1,5 Lts.