Nach Marktplatz und Land aufteilen
Eine Liste pro Markt: Behalten Sie die CSV-Zeilen für das Land und geben Sie jedem Parser eine eigene ip:port-Datei.
Der Onlinehandel lebt von fremden Daten: dem Bestand der Konkurrenz, ihren Preisen, ihren Listings, wie Käufer in jedem Land sie sehen. Marktplätze sperren Listenadressen härter als andere Websites, daher läuft der Hauptcrawl über Resi Core mit einer privaten IP aus dem richtigen Land, während unbegrenzte Pakete einfachere Shops und großes Volumen abdecken.
Marktplätze sind die am stärksten geschützten Seiten im Netz. Der Pool muss groß, lokal und frisch sein.
Angebote so, wie ein Käufer vor Ort sie sieht
Resi Core: eine private IP aus dem Land des Marktplatzes; Resi Prime ergänzt Stadt und Lieferdatum
Bestands- und Preisprüfungen über Tausende Artikel
Keine Thread-Grenze bei Resi, bis zu 2500 bei Paketen
Adressen, die eine Sperre des Marktplatzes überleben
Der Resi-Core-Pool umfasst über 2 Mio. Adressen, mit einer neuen IP bei jeder Anfrage
Ganze Seiten mit Bildern und Bewertungen
Auf unbegrenzten Paketen wird Traffic nicht gezählt; bei Resi Bilder abschalten und nur das HTML bezahlen
Schalten Sie im Scraper Bilder und Skripte ab, dann gehen die Gigabytes in das HTML der Listings. Der Preis pro GB sinkt mit der Bestellgröße.
| Bestellgröße | Resi Core | Resi Prime |
|---|---|---|
| 1 GB+ | $0.85 | $2.29 |
| 10 GB+ | $0.79 | $2.09 |
| 50 GB+ | $0.72 | $1.95 |
| 100 GB+24 % sparen | $0.65 | $1.75 |
| 500 GB+ | $0.57 | $1.55 |
| 1000 GB+ | $0.49 | $1.39 |
Preise in US-Dollar pro 1 GB. Sie kaufen ganze Gigabytes, ab einem einzigen.
Pool
Sie sparen 24 % ($20.00) gegenüber dem Preis ab 1 GB
Legen Sie 400 GB dazu, dann sinkt jedes Gigabyte auf $0.57
Diese Menge kaufenSie können die Gigabytes 3 Monate ab dem Kauf nutzen; was danach übrig ist, verfällt.
Eine Liste pro Markt: Behalten Sie die CSV-Zeilen für das Land und geben Sie jedem Parser eine eigene ip:port-Datei.
Bestand jede Stunde, Preise zweimal am Tag, Angebote einmal am Tag. Jede Anfrage von der nächsten Adresse der Liste.
Speichern Sie Preis, Bestandsmarke, Lieferdatum und das Land der IP mit jedem Datensatz: Das Land erklärt später die Unterschiede.
Füllen Sie products.txt und stellen Sie COUNTRY ein; jedes Produkt wird über einen lokalen Proxy gelesen, Preis und Bestandsmarke werden herausgezogen und an stock.csv angehängt, so entsteht eine Historie für Diagramme. Passen Sie PRICE_RE und INSTOCK_RE an den Marktplatz an.
#!/usr/bin/env python3
"""Marketplace stock and price watcher for Advanced.name proxies.
For each product URL it fetches the page through a proxy from the target country
and pulls both the price and an in-stock flag, writing a CSV you can chart over
time. Standard library only. Edit CONFIG and run: python3 stock.py
"""
# ================================ CONFIG ====================================
CSV_URL = "https://get.advanced.name/YOUR_LIST_ID.csv" # CSV export link from your dashboard
COUNTRY = "IT" # marketplace country
MIN_SPEED = 3
PRODUCTS_FILE = "products.txt" # one product URL per line
PRICE_RE = r'"price"\s*:\s*"?([0-9][0-9.,]*)' # group 1 = price
INSTOCK_RE = r'"availability"\s*:\s*"[^"]*InStock' # matches when in stock
OUT_FILE = "stock.csv" # url;price;in_stock;proxy is written here
THREADS = 40
TIMEOUT = 20
RETRIES = 3
# ============================================================================
import csv
import io
import itertools
import re
import sys
import threading
import time
import urllib.request
from concurrent.futures import ThreadPoolExecutor, as_completed
COL_IP, COL_PORT, COL_COUNTRY, COL_SPEED = 0, 1, 2, 3
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0 Safari/537.36"
PRICE = re.compile(PRICE_RE)
INSTOCK = re.compile(INSTOCK_RE)
def load_proxies():
raw = urllib.request.urlopen(CSV_URL, timeout=30).read().decode("utf-8", "replace")
pool = []
for row in csv.reader(io.StringIO(raw), delimiter=";"):
if len(row) <= COL_SPEED or not row[COL_PORT].strip().isdigit():
continue
if COUNTRY and row[COL_COUNTRY].strip().upper() != COUNTRY.upper():
continue
if int(row[COL_SPEED] or 0) < MIN_SPEED:
continue
pool.append(row[COL_IP].strip() + ":" + row[COL_PORT].strip())
return pool
def main():
proxies = load_proxies()
if not proxies:
sys.exit("No proxies for COUNTRY=%r." % COUNTRY)
with open(PRODUCTS_FILE, encoding="utf-8") as fh:
products = [line.strip() for line in fh if line.strip() and not line.startswith("#")]
print("proxies: %d (%s), products: %d" % (len(proxies), COUNTRY, len(products)))
rotation = itertools.cycle(proxies)
lock = threading.Lock()
def watch(url):
for _ in range(RETRIES):
with lock:
proxy = next(rotation)
handler = urllib.request.ProxyHandler({"http": "http://" + proxy, "https": "http://" + proxy})
req = urllib.request.Request(url, headers={"User-Agent": UA, "Accept-Language": COUNTRY.lower()})
try:
html = urllib.request.build_opener(handler).open(req, timeout=TIMEOUT).read().decode("utf-8", "replace")
except Exception:
continue
price = PRICE.search(html)
return (price.group(1) if price else ""), ("yes" if INSTOCK.search(html) else "no"), proxy
return "", "unreachable", ""
rows = []
with ThreadPoolExecutor(max_workers=THREADS) as pool:
futures = {pool.submit(watch, u): u for u in products}
for fut in as_completed(futures):
url = futures[fut]
price, stock, proxy = fut.result()
rows.append((time.strftime("%Y-%m-%d %H:%M"), url, price, stock, proxy))
print("%-4s %-9s %s" % (stock, price, url[:56]))
header = not _exists(OUT_FILE)
with open(OUT_FILE, "a", encoding="utf-8", newline="") as out:
writer = csv.writer(out, delimiter=";")
if header:
writer.writerow(["checked_at", "url", "price", "in_stock", "proxy"])
writer.writerows(rows)
print("appended %d rows to %s" % (len(rows), OUT_FILE))
def _exists(path):
try:
open(path).close()
return True
except OSError:
return False
if __name__ == "__main__":
main()
Bauen Sie aus dem CSV-Export eine eigene ip:port-Liste pro Land des Marktplatzes und geben Sie jedem Parser seine eigene Datei. Senden Sie das Länder-Cookie des Marktplatzes mit der regionalen IP; manche Seiten lesen die Region aus einem Cookie, bevor sie die Adresse ansehen.
Holen Sie Bestandszahlen von der Produktseite oder aus dem Warenkorb, nicht aus zwischengespeicherten Suchergebnissen, und bremsen Sie bei 403 pro Marktplatz statt überall.
Starten Sie den Beobachter oben per cron und hängen Sie alles an eine CSV an, so entsteht eine Historie für Diagramme. Protokollieren Sie das Land der IP mit jedem Datensatz; es erklärt später Unterschiede bei Preis und Lieferung.
Halten Sie den Pool mit dem Socks List Processor frisch und testen Sie den Parser mit der kostenlosen Proxyliste, bevor Sie den ganzen Katalog angehen.



Crawlen Sie große Marktplätze über Resi Core, halten Sie Verkäuferkonto und Städtepreise auf Resi Prime und holen Sie einfachere Shops günstiger über ein unbegrenztes Paket.
Marktplatz-CrawlingBeste Wahl
Eine private IP aus dem Land des Marktplatzes bei jeder Anfrage, eine gesperrte Adresse stoppt den Crawl also nicht. Die gekauften Gigabytes verbrauchen Sie über drei Monate.
ab $0.49 pro GB1 GB für $0.85
Verkäuferkonto und Stadt
Ein Verkäuferkonto bleibt bis zu 24 Stunden auf einer privaten IP. Stadt und ISP im String zeigen Preis und Lieferdatum, die ein Käufer in dieser Stadt sieht.
ab $1.39 pro GB1 GB für $2.29
Einfache Shops und Volumen
Traffic wird nicht gezählt, vollständige Listings mit Bildern erhöhen die Rechnung also nicht. Passt zu Shops, die Listenadressen nicht sperren.
$397 pro Monatoder $2.20 pro Stunde
Nehmen Sie Resi Core für die Marktplätze, testen Sie den Scraper mit 1 GB und lassen Sie den Tracker auf jedem Markt laufen, auf dem Sie verkaufen.