Divide por marketplace y país
Una lista por mercado: quédate con las filas del CSV de ese país y dale a cada parser su propio archivo ip:port.
El comercio online vive de datos ajenos: el stock de la competencia, sus precios, sus fichas tal como las ven los compradores de cada país. Los marketplaces cortan las direcciones de las listas con más dureza que otros sitios, así que el rastreo principal va por Resi Core con una IP doméstica del país adecuado, mientras que los paquetes ilimitados cubren las tiendas más sencillas y los grandes volúmenes.
Los marketplaces son los sitios mejor defendidos de la web. El pool tiene que ser grande, local y fresco.
Fichas como las ve un comprador local
Resi Core: una IP doméstica del país del mercado; Resi Prime añade la ciudad y la fecha de entrega
Revisión de stock y precios en miles de SKU
Sin límite de hilos en Resi, hasta 2500 en los paquetes
Direcciones que sobreviven a un bloqueo del marketplace
El pool de Resi Core tiene más de 2 M de direcciones, con una IP nueva en cada petición
Páginas completas con imágenes y reseñas
El tráfico no se cuenta en los paquetes ilimitados; en Resi desactiva las imágenes y paga solo el HTML
Desactiva las imágenes y los scripts en el scraper, y los gigabytes se van al HTML de las fichas. El precio por GB baja con el tamaño del pedido.
| Tamaño del pedido | Resi Core | Resi Prime |
|---|---|---|
| 1 GB+ | $0.85 | $2.29 |
| 10 GB+ | $0.79 | $2.09 |
| 50 GB+ | $0.72 | $1.95 |
| 100 GB+ahorra un 24% | $0.65 | $1.75 |
| 500 GB+ | $0.57 | $1.55 |
| 1000 GB+ | $0.49 | $1.39 |
Precios en dólares estadounidenses por 1 GB. Se compran gigabytes enteros, a partir de uno.
Pool
Ahorras un 24% ($20.00) frente al precio de 1 GB+
Añade 400 GB y cada gigabyte baja a $0.57
Comprar esta cantidadPuedes usar los gigabytes durante 3 meses desde la compra; lo que quede después se da de baja.
Una lista por mercado: quédate con las filas del CSV de ese país y dale a cada parser su propio archivo ip:port.
Stock cada hora, precios dos veces al día, fichas una vez al día. Cada petición desde la siguiente dirección de la lista.
Guarda con cada registro el precio, la marca de disponibilidad, la fecha de entrega y el país de la IP: el país explicará después las diferencias.
Rellena products.txt y fija COUNTRY; cada producto se lee a través de un proxy local, se extraen el precio y una marca de disponibilidad y se añaden a stock.csv, así construyes un historial para graficar. Ajusta PRICE_RE e INSTOCK_RE al 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()
Crea a partir de la exportación CSV una lista ip:port aparte por país de marketplace y dale a cada parser su propio archivo. Envía la cookie de país del marketplace con la IP regional; algunos sitios leen la región de una cookie antes que de la dirección.
Toma el stock de la página de producto o del carrito, no de los resultados de búsqueda, que van en caché, y frena por marketplace, no en general, cuando aparezcan los 403.
Lanza el vigilante de arriba desde cron y añade a un solo CSV para ir construyendo un historial que graficar. Anota el país de la IP en cada registro; luego el país explica las diferencias de precio y de entrega.
Mantén el pool fresco con el Socks List Processor y prueba el parser con la lista de proxies gratis antes de pasar al catálogo completo.



Rastrea los grandes marketplaces con Resi Core, mantén la cuenta de vendedor y los precios por ciudad en Resi Prime, y saca las tiendas más sencillas con un paquete ilimitado por menos.
Rastreo de marketplacesLa mejor opción
Una IP doméstica del país del mercado en cada petición, así que una dirección bloqueada no detiene el rastreo. Los gigabytes que compras los gastas en tres meses.
desde $0.49 por GB1 GB por $0.85
Cuenta de vendedor y ciudad
Una cuenta de vendedor se queda en una IP doméstica hasta 24 horas. La ciudad y el ISP en la cadena muestran el precio y la fecha de entrega que ve un comprador de esa ciudad.
desde $1.39 por GB1 GB por $2.29
Tiendas sencillas y volumen
El tráfico no se cuenta, así que los listados completos con imágenes no encarecen la factura. Sirve para tiendas que no cortan las direcciones de las listas.
$397 al meso $2.20 por hora
Toma Resi Core para los marketplaces, prueba el scraper con 1 GB y pon el tracker en todos los mercados donde vendes.