交易查找应用程序会监视零售商的产品价格,并在价格大幅下跌时通知用户。关键指标是当前价格与原始价格或历史价格的比较,以折扣百分比表示。来自 Scavio API 的亚马逊和沃尔玛产品响应包括当前价格和原始价格(如果有),从而可以轻松地即时计算折扣。本教程构建了一个交易查找器,用于扫描产品搜索结果、计算折扣并输出高于可配置阈值的交易。
前置条件
- Python 3.8 或更高版本
- 请求已安装库
- Scavio API 密钥
- 基本的 Python 数学和字符串解析
操作指南
步骤 1: 搜索产品并提取价格
查询亚马逊的产品类别并提取每个结果的当前价格和原始价格。
Python
def extract_prices(product: dict) -> tuple[float | None, float | None]:
def parse(s):
return float(s.replace("$", "").replace(",", "")) if s else None
return parse(product.get("price")), parse(product.get("original_price"))步骤 2: 计算折扣百分比
计算当前价格和原价的折扣百分比。如果没有原价,则返回 0。
Python
def discount_pct(current: float | None, original: float | None) -> float:
if not current or not original or original <= current:
return 0.0
return round((original - current) / original * 100, 1)步骤 3: 过滤高于阈值的交易
扫描所有产品并返回折扣百分比等于或高于配置阈值的产品。
Python
def find_deals(products: list[dict], min_discount: float = 20.0) -> list[dict]:
deals = []
for p in products:
current, original = extract_prices(p)
pct = discount_pct(current, original)
if pct >= min_discount:
deals.append({**p, "discount_pct": pct})
return sorted(deals, key=lambda x: x["discount_pct"], reverse=True)步骤 4: 打印交易提醒
为每个合格产品输出格式化的交易警报。
Python
def print_deals(deals: list[dict]) -> None:
if not deals:
print("No deals found above threshold")
return
for d in deals:
print(f"[{d['discount_pct']}% OFF] {d['title'][:50]}")
print(f" Now: {d.get('price')} | Was: {d.get('original_price')}")Python 示例
Python
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def search_amazon(query: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"platform": "amazon", "query": query, "marketplace": "US"})
r.raise_for_status()
return r.json().get("products", [])
def parse_price(s): return float(s.replace("$", "").replace(",", "")) if s else None
def find_deals(products, min_pct=20):
deals = []
for p in products:
curr = parse_price(p.get("price"))
orig = parse_price(p.get("original_price"))
if curr and orig and orig > curr:
pct = round((orig - curr) / orig * 100, 1)
if pct >= min_pct:
deals.append({**p, "pct": pct})
return sorted(deals, key=lambda x: x["pct"], reverse=True)
if __name__ == "__main__":
products = search_amazon("bluetooth headphones")
for deal in find_deals(products):
print(f"[{deal['pct']}% off] {deal.get('title', '')[:50]} — {deal.get('price')}")JavaScript 示例
JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
async function searchAmazon(query) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform: "amazon", query, marketplace: "US" })
});
const data = await res.json();
return data.products || [];
}
function parsePrice(s) { return s ? parseFloat(s.replace(/[$,]/g, "")) : null; }
function findDeals(products, minPct = 20) {
return products
.map(p => ({ ...p, pct: (() => {
const curr = parsePrice(p.price), orig = parsePrice(p.original_price);
return curr && orig && orig > curr ? Math.round((orig - curr) / orig * 1000) / 10 : 0;
})() }))
.filter(p => p.pct >= minPct)
.sort((a, b) => b.pct - a.pct);
}
searchAmazon("bluetooth headphones").then(products => {
findDeals(products).forEach(d => console.log(`[${d.pct}% off] ${d.title?.slice(0, 50)} — ${d.price}`));
}).catch(console.error);预期输出
JSON
[45% off] Beats Studio3 Wireless Headphones
Now: $109.99 | Was: $199.99
[30% off] Sony WH-CH520 Wireless Headphones
Now: $34.99 | Was: $49.99
[25% off] JBL Tune 510BT Wireless On-Ear
Now: $29.99 | Was: $39.99