Separe por marketplace e país
Uma lista por mercado: fique com as linhas do CSV daquele país e dê a cada parser seu próprio arquivo ip:port.
O varejo online vive de dados alheios: o estoque dos concorrentes, seus preços, suas listagens como os compradores de cada país as veem. Os marketplaces cortam endereços de listas com mais rigor que outros sites, então a varredura principal passa pelo Resi Core com um IP residencial do país certo, enquanto os pacotes ilimitados cobrem lojas mais simples e grandes volumes.
Marketplaces são os sites mais protegidos da web. O pool precisa ser grande, local e renovado.
Anúncios como o comprador local vê
Resi Core: um IP residencial do país do marketplace; o Resi Prime acrescenta a cidade e a data de entrega
Checagem de estoque e preço em milhares de SKUs
Sem limite de threads no Resi, até 2500 nos pacotes
Endereços que sobrevivem a um bloqueio do marketplace
O pool do Resi Core tem mais de 2 milhões de endereços, com um IP novo a cada requisição
Páginas completas com imagens e avaliações
O tráfego não é contado nos pacotes ilimitados; no Resi desligue as imagens e pague só o HTML
Desligue imagens e scripts no scraper, e os gigabytes vão para o HTML das listagens. O preço por GB cai com o tamanho do pedido.
| Tamanho do 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+economize 24% | $0.65 | $1.75 |
| 500 GB+ | $0.57 | $1.55 |
| 1000 GB+ | $0.49 | $1.39 |
Preços em dólares americanos por 1 GB. Você compra gigabytes inteiros, a partir de um.
Pool
Você economiza 24% ($20.00) em relação ao preço de 1 GB+
Adicione 400 GB e cada gigabyte cai para $0.57
Comprar esta quantidadeVocê pode usar os gigabytes por 3 meses a partir da compra; o que sobrar depois disso é baixado.
Uma lista por mercado: fique com as linhas do CSV daquele país e dê a cada parser seu próprio arquivo ip:port.
Estoque toda hora, preços duas vezes por dia, anúncios uma vez por dia. Cada requisição a partir do próximo endereço da lista.
Salve com cada registro o preço, a marca de disponibilidade, a data de entrega e o país do IP: o país explica as diferenças depois.
Preencha products.txt e defina COUNTRY; cada produto é lido por um proxy local, o preço e uma marca de disponibilidade são extraídos e acrescentados a stock.csv, formando um histórico para gráfico. Ajuste PRICE_RE e INSTOCK_RE ao 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()
Monte a partir da exportação CSV uma lista ip:port separada por país de marketplace e dê a cada parser seu próprio arquivo. Envie o cookie de país do marketplace com o IP regional; alguns sites leem a região de um cookie antes do endereço.
Pegue o estoque da página do produto ou do carrinho, não dos resultados de busca, que ficam em cache, e desacelere por marketplace, não no geral, quando aparecerem 403.
Rode o monitor acima pelo cron e acrescente tudo num único CSV para ir formando um histórico de gráfico. Registre o país do IP em cada registro; depois o país explica as diferenças de preço e de entrega.
Mantenha o pool renovado com o Socks List Processor e teste o parser na lista de proxies grátis antes do catálogo completo.



Varra os grandes marketplaces pelo Resi Core, mantenha a conta de vendedor e os preços por cidade no Resi Prime, e puxe as lojas mais simples num pacote ilimitado por menos.
Varredura de marketplacesMelhor escolha
Um IP residencial do país do marketplace a cada requisição, então um endereço bloqueado não para a varredura. Os gigabytes comprados você gasta em três meses.
a partir de $0.49 por GB1 GB por $0.85
Conta de vendedor e cidade
Uma conta de vendedor fica num IP residencial por até 24 horas. Cidade e provedor na string mostram o preço e a data de entrega que um comprador daquela cidade vê.
a partir de $1.39 por GB1 GB por $2.29
Lojas simples e volume
O tráfego não é contado, então listagens completas com imagens não aumentam a conta. Serve para lojas que não cortam endereços de listas.
$397 por mêsou $2.20 por hora
Escolha o Resi Core para os marketplaces, teste o scraper com 1 GB e rode o tracker em todos os mercados onde você vende.