Split the catalogue by shop
Each shop gets its own request queue and its own share of the proxy list. Big marketplaces get the largest share.
Shops show different prices to different regions and block anyone who asks too often from one address. A price tracker on Advanced.name spreads its requests across tens of thousands of IPv4 addresses and asks each shop from the region of its buyers.
A tracker visits the same pages every hour. That pattern is what gets blocked, and the pool has to hide it.
A different IP for each visit to the same product
Package #4 holds 30,000 addresses: a product card sees the same IP once a month
Prices as local shoppers see them
Europe, CIS and China pools; World MIX for the US and other markets
Thousands of SKUs checked every hour
Up to 2,500 threads on package #4, 5,000 on package #6
Pages with images and scripts, not just JSON
No traffic limit: fetch full pages as often as the schedule says
Ten thousand SKUs an hour fit in package #3; a marketplace-wide watch needs #4 or bigger.
Each shop gets its own request queue and its own share of the proxy list. Big marketplaces get the largest share.
Take the next address for every request, retry twice on a different one, log the price with the IP that fetched it.
Addresses leave the pool as they get old. The link always returns the current set, so re-read it on a timer.
Fill products.txt with product URLs and set COUNTRY. Each product is fetched through the next proxy, the price is pulled out and written to prices.csv. Adjust PRICE_RE to the shop's markup. Trial it on the free proxy list first.
#!/usr/bin/env python3
"""Price monitor for Advanced.name proxies.
Fetches product pages through proxies from the buyer's country and pulls the
price out of each page. One request per product goes through the next proxy, so
a shop sees the same address rarely. Standard library only. python3 prices.py
"""
# ================================ CONFIG ====================================
CSV_URL = "https://get.advanced.name/YOUR_LIST_ID.csv" # CSV export link from your dashboard
COUNTRY = "DE" # buyers' country: prices are read as local shoppers see them
MIN_SPEED = 3
PRODUCTS_FILE = "products.txt" # one product URL per line
PRICE_RE = r'"price"\s*:\s*"?([0-9][0-9.,]*)' # regex, group 1 = the price
OUT_FILE = "prices.csv" # url;price;proxy;country is written here
THREADS = 40
TIMEOUT = 20
RETRIES = 3
# ============================================================================
import csv
import io
import itertools
import re
import sys
import threading
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 (compatible; price-monitor/1.0)"
PRICE = re.compile(PRICE_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 grab(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() + "," + COUNTRY.upper()})
try:
html = urllib.request.build_opener(handler).open(req, timeout=TIMEOUT).read().decode("utf-8", "replace")
except Exception:
continue
match = PRICE.search(html)
return (match.group(1) if match else "not found"), proxy
return "unreachable", ""
rows = []
with ThreadPoolExecutor(max_workers=THREADS) as pool:
futures = {pool.submit(grab, u): u for u in products}
for fut in as_completed(futures):
url = futures[fut]
price, proxy = fut.result()
rows.append((url, price, proxy, COUNTRY))
print("%-9s %s" % (price, url[:60]))
with open(OUT_FILE, "w", encoding="utf-8", newline="") as out:
writer = csv.writer(out, delimiter=";")
writer.writerow(["url", "price", "proxy", "country"])
writer.writerows(rows)
print("written %s (%d rows)" % (OUT_FILE, len(rows)))
if __name__ == "__main__":
main()
Fetch each product page through the next proxy and pull the price from the JSON-LD block or the price node; the script above uses a regex you tune per shop. Send the region's Accept-Language and currency cookie with the local IP, or the shop may redirect you to another market.
Schedule by pressure: stock every hour, prices twice a day. Store the HTTP status with every price, so a burst of 403s from one shop tells you to slow down there, not everywhere.
Price-watch services and no-code scrapers (Octoparse, Web Scraper) take a proxy list in settings — paste the same ip:port file. Even Google Sheets IMPORTXML can run behind a small proxy relay for light checks.
Keep the pool fresh with the proxy checker and test the flow on the free proxy list before you scale to a full catalogue.



An hourly catalogue run pays off on an unlimited package. Strictly protected shops and city prices need residential addresses.
Catalogue every hourBest fit
A product card meets the same IP about once a month at hourly checks. Full pages do not raise the bill.
$990 per monthor $4.20 per hour
Strict shops
A home IP from the shop country on every request. For sites that show list addresses a captcha instead of a price.
from $0.49 per GB1 GB for $0.85
City prices
City and region in the connection string. The shop shows the price and delivery that a buyer in that city sees.
from $1.39 per GB1 GB for $2.29
Choose the package, take the free hour, run the tracker across the whole catalogue.