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.