Code on screen
Tutorial Node.js

Bygga en prisövervakare med Node.js och proxyapi.se

I denna tutorial bygger vi en automatiserad prisövervakare som bevakar priser på svenska e-handelsplatser via proxyapi.se. Vi använder Node.js, axios och cheerio.

Förutsättningar

  • Node.js 18+
  • Ett proxyapi.se-konto med API-nyckel
  • npm eller pnpm

1. Projekt-setup

mkdir price-monitor && cd price-monitor
npm init -y
npm install axios cheerio https-proxy-agent

2. Hämta en sida via proxyn

import axios from "axios";
import { HttpsProxyAgent } from "https-proxy-agent";
import * as cheerio from "cheerio";

const API_KEY = process.env.PROXYAPI_KEY || "sk_live_din_nyckel";
const agent = new HttpsProxyAgent(
  `http://${API_KEY}:@proxy.proxyapi.se:8080`
);

async function fetchPrice(url, selector) {
  const { data } = await axios.get(url, {
    httpsAgent: agent,
    headers: {
      "User-Agent": "PriceMonitor/1.0 (hello@proxyapi.se)",
    },
    timeout: 15000,
  });

  const $ = cheerio.load(data);
  const priceText = $(selector).first().text().trim();
  const price = parseFloat(
    priceText.replace(/[^0-9,.]/g, "").replace(",", ".")
  );

  return { url, price, raw: priceText, timestamp: new Date().toISOString() };
}

3. Bevaka flera produkter

const products = [
  {
    name: "Produkt A",
    url: "https://example-shop.se/produkt-a",
    selector: ".product-price",
  },
  {
    name: "Produkt B",
    url: "https://example-shop.se/produkt-b",
    selector: ".price-tag",
  },
];

async function checkPrices() {
  console.log(`[${new Date().toISOString()}] Kontrollerar priser...`);

  for (const product of products) {
    try {
      const result = await fetchPrice(product.url, product.selector);
      console.log(`  ${product.name}: ${result.price} kr`);

      // Här kan du spara till databas, skicka notis vid prisändring, etc.
    } catch (err) {
      console.error(`  ${product.name}: FEL - ${err.message}`);
    }

    // Vänta 2 sekunder mellan requests
    await new Promise((r) => setTimeout(r, 2000));
  }
}

// Kör varje timme
checkPrices();
setInterval(checkPrices, 60 * 60 * 1000);

4. Spara historik och detektera ändringar

import { writeFileSync, readFileSync, existsSync } from "fs";

const HISTORY_FILE = "price-history.json";

function loadHistory() {
  if (!existsSync(HISTORY_FILE)) return {};
  return JSON.parse(readFileSync(HISTORY_FILE, "utf-8"));
}

function savePrice(name, price) {
  const history = loadHistory();
  if (!history[name]) history[name] = [];

  const lastPrice = history[name].at(-1)?.price;
  history[name].push({ price, timestamp: new Date().toISOString() });
  writeFileSync(HISTORY_FILE, JSON.stringify(history, null, 2));

  if (lastPrice && lastPrice !== price) {
    const change = price - lastPrice;
    const pct = ((change / lastPrice) * 100).toFixed(1);
    console.log(
      `  ⚡ PRISÄNDRING: ${name} ${lastPrice} → ${price} (${change > 0 ? "+" : ""}${pct}%)`
    );
  }
}

Tips

  • Respektera robots.txt — kontrollera att sajten tillåter scraping
  • Sätt User-Agent — identifiera din monitor
  • Använd rimliga intervall — en gång per timme räcker oftast
  • Övervaka din kvot — varje request förbrukar en liten mängd data via proxyn
  • Hantera fel — sajter kan ändra sin HTML, ha driftstörningar, eller svara långsamt

Nästa steg

Du kan utöka monitorn med:

  • Slack- eller e-postnotiser vid prisändringar
  • Dashboard med prishistorik (t.ex. med Recharts)
  • Jämförelse mellan flera butiker för samma produkt
  • Schemaläggning via cron eller PM2

Se din förbrukning i dashboarden eller via usage-API:et.