#!/usr/bin/env python3
"""Spiele-Offensive Top-30: Strict AID-to-image mapping from listing pages."""
import re, urllib.request, sys
from datetime import datetime
UA = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"
NOW = datetime.now().strftime("%d.%m.%Y %H:%M")
OUT = "/home/hermes/workspace/spiele_offensive_top30.html"
def fetch(url, timeout=15):
req = urllib.request.Request(url, headers={"User-Agent": UA})
with urllib.request.urlopen(req, timeout=timeout) as r:
raw = r.read()
try: return raw.decode("utf-8")
except: return raw.decode("iso-8859-1", errors="replace")
# ── Build AID→image map ──
aid_img = {}
for page in range(10):
try:
h = fetch(f"https://www.spiele-offensive.de/Kat/Sonderangebote.html?sse={page}", 15)
except Exception as e:
print(f" p{page}: {e}", file=sys.stderr); continue
for m in re.finditer(
r'registerItemSelection\(dataLayer,\s*(\d+)\s*,.*?'
r'
([^<]+).*?'
r']*>([^<]+)
.*?'
r'([^<]*).*?'
r'([^<]+).*?'
r'= 80 else ("#e63946" if rabatt >= 60 else "#cc0c39")
fn = aid_img.get(aid)
if fn and img_ok(aid, fn):
src = img_url(aid, fn)
img = '
'.format(src)
ok += 1
elif fn:
src = img_url(aid, fn)
img = '
'.format(src)
else:
img = '?
'
cards.append("""
""" + img + """
""" + name + """
""" + new + """ EURUVP """ + old + """ EUR
-""" + str(rabatt) + """%
""" + saved + """
Zu Spiele-Offensive →
""")
html = """
Top 30 Brettspiel-Angebote \u2014 Spiele-Offensive.de
Top 30 Brettspiel-Angebote auf Spiele-Offensive.de
Stand: """ + NOW + """ · Sortiert nach Rabatt · Preise inkl. MwSt. · Affiliate-Links (PID 505) · Bilder: Spiele-Offensive
""" + "\n".join(cards) + """
"""
with open(OUT, "w") as f:
f.write(html)
print("Done: {} deals, {} verified images, {} bytes".format(len(top30), ok, len(html)), file=sys.stderr)
print("FILE:{}".format(OUT))