Split by marketplace and country
One list per market: keep the CSV rows for that country and give each parser its own ip:port file.
Online retail runs on other people’s data: competitor stock, their prices, their listings as buyers in each country see them. Marketplaces cut list addresses harder than other sites, so the main crawl runs through Resi Core with a home IP from the right country, while unlimited packages cover simpler shops and large volume.
Marketplaces are the most defended sites on the web. The pool has to be big, local and fresh.
Listings as a local buyer sees them
Resi Core: a home IP from the market country; Resi Prime adds the city and delivery date
Stock and price checks across thousands of SKUs
No thread limit on Resi, up to 2,500 on packages
Addresses that outlast a marketplace ban
The Resi Core pool holds 2M+ addresses, with a new IP on every request
Full pages with images and reviews
Traffic is not counted on unlimited packages; on Resi turn images off and pay for HTML only
Turn off images and scripts in the scraper, and the gigabytes go to listing HTML. The price per GB drops with the order size.
| Order size | Resi Core | Resi Prime |
|---|---|---|
| 1 GB+ | $0.85 | $2.29 |
| 10 GB+ | $0.79 | $2.09 |
| 50 GB+ | $0.72 | $1.95 |
| 100 GB+save 24% | $0.65 | $1.75 |
| 500 GB+ | $0.57 | $1.55 |
| 1000 GB+ | $0.49 | $1.39 |
Prices are in US dollars per 1 GB. You buy whole gigabytes, starting with a single one.
Pool
You save 24% ($20.00) against the 1 GB+ price
Add 400 GB and every gigabyte drops to $0.57
Buy this amountYou can use the gigabytes for 3 months from the purchase date; whatever is left after that is written off.
One list per market: keep the CSV rows for that country and give each parser its own ip:port file.
Stock every hour, prices twice a day, listings once a day. Each request from the next address in the list.
Save price, stock flag, delivery date and the IP country with every record: the country explains the differences later.
Fill products.txt and set COUNTRY; each product is read through a local proxy, price and an in-stock flag are pulled and appended to stock.csv so you build a history to chart. Tune PRICE_RE and INSTOCK_RE to the 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()
Build a separate ip:port list per marketplace country from the CSV export and give each parser its own file. Send the marketplace's own country cookie with the regional IP; some sites read the region from a cookie before the address.
Take stock counts from the product page or the cart, not from search results, which are cached, and slow down per marketplace rather than globally when 403s appear.
Run the watcher above from cron and append to one CSV so you build a history to chart. Log the country of the IP with every record; the country later explains price and delivery differences.
Keep the pool fresh with the Socks List Processor, and trial the parser on the free proxy list before a full catalogue.



Crawl large marketplaces through Resi Core, keep the seller account and city prices on Resi Prime, and pull simpler shops on an unlimited package for less.
Marketplace crawlingBest fit
A home IP from the market country on every request, so one banned address does not stop the crawl. You spend the gigabytes you buy over three months.
from $0.49 per GB1 GB for $0.85
Seller account and city
A seller account stays on one home IP for up to 24 hours. City and ISP in the string show the price and delivery date a buyer in that city sees.
from $1.39 per GB1 GB for $2.29
Simpler shops and volume
Traffic is not counted, so full listings with images do not raise the bill. It suits shops that do not cut list addresses.
$397 per monthor $2.20 per hour
Take Resi Core for marketplaces, test the scraper on 1 GB and run the tracker on every market you sell in.