From fa6de68f6080ca69ceecdb49942fbccbea04dd79 Mon Sep 17 00:00:00 2001 From: Nulo Date: Thu, 4 Jan 2024 18:10:02 -0300 Subject: [PATCH] scraper: reordenar codigo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - borrar código viejo - centralizar scrapers de links --- bun.lockb | Bin 196736 -> 196048 bytes carrefour-link-scraper/package.json | 17 ----------------- dia-link-scraper/package.json | 17 ----------------- .../index.ts => link-scrapers/carrefour.ts | 0 .../index.ts => link-scrapers/coto.ts | 6 +++--- .../index.ts => link-scrapers/dia.ts | 6 +++--- .../package.json | 2 +- package.json | 4 +--- readme.md | 2 +- scraper/auto.ts | 6 +++--- scraper/cli.ts | 6 +++--- scraper/fetch.ts | 13 ------------- scraper/parsers/carrefour.ts | 2 +- scraper/{ => parsers}/common.ts | 0 scraper/parsers/dia.ts | 2 +- 15 files changed, 17 insertions(+), 66 deletions(-) delete mode 100644 carrefour-link-scraper/package.json delete mode 100644 dia-link-scraper/package.json rename carrefour-link-scraper/index.ts => link-scrapers/carrefour.ts (100%) rename coto-link-scraper/index.ts => link-scrapers/coto.ts (89%) rename dia-link-scraper/index.ts => link-scrapers/dia.ts (97%) rename {coto-link-scraper => link-scrapers}/package.json (90%) delete mode 100644 scraper/fetch.ts rename scraper/{ => parsers}/common.ts (100%) diff --git a/bun.lockb b/bun.lockb index 66e0313ad5fb4151f4874135f33c6558312c6677..39be541d5637f92d6de7e9f04fc42f1eab621f1c 100755 GIT binary patch delta 27735 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 G?Ee6XQyjto delta 27878 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 H^@;xiu2l() diff --git a/carrefour-link-scraper/package.json b/carrefour-link-scraper/package.json deleted file mode 100644 index a404536..0000000 --- a/carrefour-link-scraper/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "carrefour-link-scraper", - "type": "module", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "linkedom": "^0.16.5", - "p-map": "^7.0.1" - } -} diff --git a/dia-link-scraper/package.json b/dia-link-scraper/package.json deleted file mode 100644 index 57ff6fd..0000000 --- a/dia-link-scraper/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "dia-link-scraper", - "type": "module", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "linkedom": "^0.16.5", - "p-map": "^7.0.0" - } -} diff --git a/carrefour-link-scraper/index.ts b/link-scrapers/carrefour.ts similarity index 100% rename from carrefour-link-scraper/index.ts rename to link-scrapers/carrefour.ts diff --git a/coto-link-scraper/index.ts b/link-scrapers/coto.ts similarity index 89% rename from coto-link-scraper/index.ts rename to link-scrapers/coto.ts index b25be9b..d3de22d 100644 --- a/coto-link-scraper/index.ts +++ b/link-scrapers/coto.ts @@ -1,4 +1,3 @@ -import { getHtml } from "../scraper/fetch.js"; import { parseHTML } from "linkedom"; import PQueue from "p-queue"; import { saveUrls } from "db-datos/urlHelpers.js"; @@ -28,12 +27,13 @@ function getPage(url: string) { return async () => { let html; try { - html = await getHtml(url); + const res = await fetch(url); + html = await res.text(); } catch (error) { await getPage(url)(); return; } - const { document } = parseHTML(html.toString("utf-8")); + const { document } = parseHTML(html); const hrefs = Array.from( document.querySelectorAll(".product_info_container a"), diff --git a/dia-link-scraper/index.ts b/link-scrapers/dia.ts similarity index 97% rename from dia-link-scraper/index.ts rename to link-scrapers/dia.ts index 09b825c..5d77c52 100644 --- a/dia-link-scraper/index.ts +++ b/link-scrapers/dia.ts @@ -1,7 +1,6 @@ import pMap from "p-map"; import { decodeXML } from "entities"; import { parseHTML } from "linkedom"; -import { getHtml } from "../scraper/fetch.js"; import { saveUrls } from "db-datos/urlHelpers.js"; const categorias = [ @@ -111,8 +110,9 @@ async function scrapBySite() { await pMap( links, async (url) => { - const html = await getHtml(url); - const { document } = parseHTML(html.toString("utf-8")); + const res = await fetch(url); + const html = await res.text(); + const { document } = parseHTML(html); const hrefs = Array.from( document.querySelectorAll( diff --git a/coto-link-scraper/package.json b/link-scrapers/package.json similarity index 90% rename from coto-link-scraper/package.json rename to link-scrapers/package.json index 04e7eac..ce7f074 100644 --- a/coto-link-scraper/package.json +++ b/link-scrapers/package.json @@ -1,5 +1,5 @@ { - "name": "coto-link-scraper", + "name": "link-scrapers", "type": "module", "version": "1.0.0", "description": "", diff --git a/package.json b/package.json index 30324d4..6cc95ea 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,7 @@ "name": "preciazo", "private": true, "workspaces": [ - "dia-link-scraper", - "coto-link-scraper", - "carrefour-link-scraper", + "link-scrapers", "scraper", "sitio", "db-datos" diff --git a/readme.md b/readme.md index 18c1a50..847b3fb 100644 --- a/readme.md +++ b/readme.md @@ -4,7 +4,7 @@ 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 [carrefour-link-scraper](./carrefour-link-scraper)) crean listas de links a productos para scrapear +- los link scrapers ([link-scrapers/](./link-scrapers/)) crean listas de links a productos para scrapear (no hace falta correrlos porque ya hay listas armadas en [data/](./data/)) diff --git a/scraper/auto.ts b/scraper/auto.ts index b4bd8d5..21643fc 100644 --- a/scraper/auto.ts +++ b/scraper/auto.ts @@ -8,9 +8,9 @@ import { downloadList } from "./scrap.js"; import { db } from "db-datos/db.js"; import { like } from "drizzle-orm"; import { productoUrls } from "db-datos/schema.js"; -import { scrapDiaProducts } from "../dia-link-scraper/index.js"; -import { scrapCotoProducts } from "../coto-link-scraper/index.js"; -import { scrapCarrefourProducts } from "../carrefour-link-scraper/index.js"; +import { scrapDiaProducts } from "../link-scrapers/dia.js"; +import { scrapCotoProducts } from "../link-scrapers/coto.js"; +import { scrapCarrefourProducts } from "../link-scrapers/carrefour.js"; const supermercados: Supermercado[] = [ Supermercado.Carrefour, diff --git a/scraper/cli.ts b/scraper/cli.ts index b68bda7..0304ba8 100644 --- a/scraper/cli.ts +++ b/scraper/cli.ts @@ -1,6 +1,6 @@ -import { scrapCarrefourProducts } from "../carrefour-link-scraper/index.js"; -import { scrapCotoProducts } from "../coto-link-scraper/index.js"; -import { scrapDiaProducts } from "../dia-link-scraper/index.js"; +import { scrapCarrefourProducts } from "../link-scrapers/carrefour.js"; +import { scrapCotoProducts } from "../link-scrapers/coto.js"; +import { scrapDiaProducts } from "../link-scrapers/dia.js"; import { auto } from "./auto.js"; import { downloadList, getProduct } from "./scrap.js"; diff --git a/scraper/fetch.ts b/scraper/fetch.ts deleted file mode 100644 index 59bffb2..0000000 --- a/scraper/fetch.ts +++ /dev/null @@ -1,13 +0,0 @@ -export async function getHtml(url: string) { - const res = await fetch(url); - return readableToBuffer(res.body!); -} - -async function readableToBuffer(source: AsyncIterable) { - // https://stackoverflow.com/a/72891118 - const buffers = []; - for await (const data of source) { - buffers.push(data); - } - return Buffer.concat(buffers); -} diff --git a/scraper/parsers/carrefour.ts b/scraper/parsers/carrefour.ts index e3f74fa..b025f62 100644 --- a/scraper/parsers/carrefour.ts +++ b/scraper/parsers/carrefour.ts @@ -1,6 +1,6 @@ import { parseHTML } from "linkedom"; import { Precioish } from "../scrap.js"; -import { getProductJsonLd, priceFromMeta, stockFromMeta } from "../common.js"; +import { getProductJsonLd, priceFromMeta, stockFromMeta } from "./common.js"; function parseScriptJson(dom: Window, varname: string): T { const script = dom.window.document.querySelector( diff --git a/scraper/common.ts b/scraper/parsers/common.ts similarity index 100% rename from scraper/common.ts rename to scraper/parsers/common.ts diff --git a/scraper/parsers/dia.ts b/scraper/parsers/dia.ts index be3e2c5..5fdd1ca 100644 --- a/scraper/parsers/dia.ts +++ b/scraper/parsers/dia.ts @@ -1,6 +1,6 @@ import { parseHTML } from "linkedom"; import { type Precioish } from "../scrap.js"; -import { getMetaProp, getProductJsonLd, priceFromMeta } from "../common.js"; +import { getMetaProp, getProductJsonLd, priceFromMeta } from "./common.js"; export function getDiaProduct(html: string | Buffer): Precioish { const dom = parseHTML(html);