Compare commits

..

No commits in common. "df85e43b5e44c90af25f17cb46a5dfce6fe00bc3" and "5d37ca01e8ad6fa4218dfe7b8af558945471f499" have entirely different histories.

7 changed files with 12 additions and 81 deletions

View file

@ -1,4 +0,0 @@
{
"spellright.language": ["es_AR"],
"spellright.documentTypes": ["markdown", "latex", "plaintext"]
}

View file

@ -1,11 +1,13 @@
import type { Config } from "drizzle-kit";
export const DB_PATH = process.env.DB_PATH ?? "../scraper/sqlite.db";
if (!process.env.DB_PATH) throw new Error("no hay DB_PATH");
export const DB_PATH = process.env.DB_PATH;
export default {
schema: "./schema.ts",
out: "./drizzle",
dbCredentials: {
url: DB_PATH,
url: process.env.DB_PATH,
},
} satisfies Config;

View file

@ -5,6 +5,7 @@
"description": "",
"main": "index.js",
"scripts": {
"migrate": "bun migrate.ts",
"generate": "drizzle-kit generate:sqlite"
},
"keywords": [],

View file

@ -1,42 +0,0 @@
# 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.warc.zst
```
después, scrapealo a una BD:
```
cd scraper/
bun install
bun cli.ts scrap ../dia-sample.warc.zst
```
ahora miralo en el sitio:
```
cd sitio/
bun install
bun --bun dev
```

View file

@ -6,7 +6,6 @@
"dev": "vite dev",
"build": "vite build",
"build:container": "bun --bun vite build && podman build -t gitea.nulo.in/nulo/preciazo/sitio .",
"push:container": "bun build:container && podman push gitea.nulo.in/nulo/preciazo/sitio",
"preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",

View file

@ -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 ?? "../scraper/sqlite.db");
const sqlite = new Database(env.DB_PATH);
export const db = drizzle(sqlite, { schema });
export * as schema from "db-datos/schema.js";

View file

@ -6,30 +6,6 @@
<h1 class="text-xl">WIP</h1>
<section>
<h2 class="text-lg font-bold">Ejemplos</h2>
<ul>
<li>
<a href="/ean/7790070410795">
Cookies Sabor Vainilla Con Chips De Chocolate Exquisita Paq 300 Grm
</a>
</li>
<li>
<a href="/ean/7794000006911">
Sopa Instantánea KNORR QUICK Zapallo Romero Sobres 5 Un.
</a>
</li>
<li>
<a href="/ean/7798062540253">Agua Saborizada Levité Pera 1,5 Lts.</a>
</li>
<li>
<a href="/ean/7790895000430">Gaseosa Coca-Cola Sabor Original 1,5 Lts.</a>
</li>
</ul>
</section>
<section>
<h2 class="text-lg font-bold">Random</h2>
<ul>
{#each data.precios as product}
<li>
@ -39,4 +15,3 @@
</li>
{/each}
</ul>
</section>