mirror of
https://github.com/catdevnull/preciazo.git
synced 2024-11-22 14:16:19 +00:00
Compare commits
5 commits
5d37ca01e8
...
df85e43b5e
Author | SHA1 | Date | |
---|---|---|---|
df85e43b5e | |||
254a068091 | |||
c217161d21 | |||
ecbf126619 | |||
bf0313a4b6 |
7 changed files with 81 additions and 12 deletions
4
.vscode/settings.json
vendored
Normal file
4
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"spellright.language": ["es_AR"],
|
||||
"spellright.documentTypes": ["markdown", "latex", "plaintext"]
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"migrate": "bun migrate.ts",
|
||||
"generate": "drizzle-kit generate:sqlite"
|
||||
},
|
||||
"keywords": [],
|
||||
|
|
42
readme.md
Normal file
42
readme.md
Normal file
|
@ -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.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
|
||||
```
|
|
@ -6,6 +6,7 @@
|
|||
"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",
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -6,12 +6,37 @@
|
|||
|
||||
<h1 class="text-xl">WIP</h1>
|
||||
|
||||
<ul>
|
||||
{#each data.precios as product}
|
||||
<section>
|
||||
<h2 class="text-lg font-bold">Ejemplos</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<a href={`/ean/${product.ean}`}>
|
||||
{product.name}
|
||||
<a href="/ean/7790070410795">
|
||||
Cookies Sabor Vainilla Con Chips De Chocolate Exquisita Paq 300 Grm
|
||||
</a>
|
||||
</li>
|
||||
{/each}
|
||||
</ul>
|
||||
<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>
|
||||
<a href={`/ean/${product.ean}`}>
|
||||
{product.name}
|
||||
</a>
|
||||
</li>
|
||||
{/each}
|
||||
</ul>
|
||||
</section>
|
||||
|
|
Loading…
Reference in a new issue