Découpez par marketplace et par pays
Une liste par marché : gardez les lignes du CSV de ce pays et donnez à chaque parseur son propre fichier ip:port.
Le commerce en ligne vit des données des autres : le stock des concurrents, leurs prix, leurs fiches telles que les voient les acheteurs de chaque pays. Les places de marché coupent les adresses des listes plus durement que les autres sites, alors le crawl principal passe par Resi Core avec une IP résidentielle du bon pays, tandis que les packs illimités couvrent les boutiques plus simples et les gros volumes.
Les marketplaces sont les sites les mieux défendus du web. Le pool doit être grand, local et frais.
Des fiches telles que les voit un acheteur local
Resi Core : une IP résidentielle du pays du marché ; Resi Prime ajoute la ville et la date de livraison
Des contrôles de stock et de prix sur des milliers de références
Pas de limite de threads sur Resi, jusqu'à 2500 sur les packs
Des adresses qui survivent à un blocage de marketplace
Le pool Resi Core compte 2M+ adresses, avec une nouvelle IP à chaque requête
Des pages complètes avec images et avis
Le trafic n'est pas compté sur les packs illimités ; sur Resi, coupez les images et ne payez que le HTML
Coupez les images et les scripts dans le scraper, et les gigaoctets vont au HTML des fiches. Le prix au Go baisse avec la taille de la commande.
| Taille de la commande | Resi Core | Resi Prime |
|---|---|---|
| 1 Go+ | $0.85 | $2.29 |
| 10 Go+ | $0.79 | $2.09 |
| 50 Go+ | $0.72 | $1.95 |
| 100 Go+−24 % | $0.65 | $1.75 |
| 500 Go+ | $0.57 | $1.55 |
| 1000 Go+ | $0.49 | $1.39 |
Prix en dollars américains pour 1 Go. Vous achetez des gigaoctets entiers, à partir d'un seul.
Pool
Vous économisez 24 % ($20.00) par rapport au prix pour 1 Go et plus
Ajoutez 400 Go et chaque gigaoctet descend à $0.57
Acheter cette quantitéVous pouvez utiliser les gigaoctets pendant 3 mois à compter de l'achat ; ce qui reste ensuite est annulé.
Une liste par marché : gardez les lignes du CSV de ce pays et donnez à chaque parseur son propre fichier ip:port.
Stock toutes les heures, prix deux fois par jour, fiches une fois par jour. Chaque requête depuis l'adresse suivante de la liste.
Enregistrez avec chaque relevé le prix, l'indicateur de stock, la date de livraison et le pays de l'IP : le pays expliquera les écarts plus tard.
Remplissez products.txt et réglez COUNTRY ; chaque produit est lu via un proxy local, le prix et un indicateur de stock sont extraits puis ajoutés à stock.csv, ce qui construit un historique à tracer. Adaptez PRICE_RE et INSTOCK_RE à la marketplace.
#!/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()
À partir de l'export CSV, construisez une liste ip:port distincte par pays de marketplace et donnez à chaque parseur son propre fichier. Envoyez le cookie de pays de la marketplace avec l'IP régionale ; certains sites lisent la région dans un cookie avant l'adresse.
Prenez les stocks sur la page produit ou dans le panier, pas dans les résultats de recherche mis en cache, et ralentissez par marketplace plutôt que globalement quand les 403 apparaissent.
Lancez le veilleur ci-dessus depuis cron et ajoutez tout dans un même CSV pour bâtir un historique à tracer. Notez le pays de l'IP dans chaque relevé ; c'est lui qui expliquera plus tard les écarts de prix et de livraison.
Gardez le pool frais avec le Socks List Processor, et testez le parseur sur la liste de proxies gratuits avant le catalogue complet.



Crawlez les grandes places de marché via Resi Core, gardez le compte vendeur et les prix par ville sur Resi Prime, et collectez les boutiques plus simples sur un pack illimité pour moins cher.
Crawl des places de marchéLe meilleur choix
Une IP résidentielle du pays du marché à chaque requête, donc une adresse bannie n'arrête pas le crawl. Vous dépensez les gigaoctets achetés sur trois mois.
dès $0.49 le Go1 Go pour $0.85
Compte vendeur et ville
Un compte vendeur reste sur une IP résidentielle jusqu'à 24 heures. La ville et le FAI dans la chaîne montrent le prix et la date de livraison que voit un acheteur de cette ville.
dès $1.39 le Go1 Go pour $2.29
Boutiques simples et volume
Le trafic n'est pas compté, donc les fiches complètes avec images ne font pas monter la facture. Convient aux boutiques qui ne coupent pas les adresses des listes.
$397 par moisou $2.20 de l'heure
Prenez Resi Core pour les places de marché, testez le scraper sur 1 Go et lancez le suivi sur chaque marché où vous vendez.