Разделите каталог по магазинам
У каждого магазина своя очередь запросов и своя доля списка прокси. Крупным маркетплейсам достаётся самая большая.
Магазины показывают разные цены разным регионам и блокируют тех, кто спрашивает слишком часто с одного адреса. Трекер цен на Advanced.name размазывает запросы по десяткам тысяч адресов IPv4 и спрашивает каждый магазин из региона его покупателей.
Трекер заходит на одни и те же страницы каждый час. Именно этот рисунок и блокируют, пул должен его спрятать.
Разный IP на каждый заход к одному товару
В пакете №4 30 000 адресов: карточка товара видит один и тот же IP раз в месяц
Цены такие, какими их видит местный покупатель
Пулы Европа, СНГ и Китай; Микс Мира для США и остальных рынков
Тысячи SKU каждый час
До 2 500 потоков на пакете №4, 5 000 на пакете №6
Страницы с картинками и скриптами, а не только JSON
Лимита трафика нет: тяните полные страницы так часто, как велит расписание
Десять тысяч SKU в час укладываются в пакет №3; слежка за целым маркетплейсом требует №4 и больше.
У каждого магазина своя очередь запросов и своя доля списка прокси. Крупным маркетплейсам достаётся самая большая.
На каждый запрос берите следующий адрес, при ошибке повторяйте дважды через другой, записывайте цену вместе с IP, который её принёс.
Адреса уходят из пула по мере старения. Ссылка всегда отдаёт актуальный набор, перечитывайте её по таймеру.
Заполните products.txt ссылками на товары и задайте COUNTRY. Каждый товар тянется через следующий прокси, цена выдёргивается и пишется в prices.csv. PRICE_RE подгоните под разметку магазина. Обкатать можно на бесплатных прокси.
#!/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()
Тяните страницу товара через следующий прокси и берите цену из блока JSON-LD или узла цены; скрипт выше использует regex, который подгоняется под магазин. Отправляйте с местным IP Accept-Language и куку валюты региона, иначе магазин перекинет на другой рынок.
Расписание по нагрузке: наличие каждый час, цены дважды в день. Пишите HTTP-статус рядом с ценой — всплеск 403 от одного магазина значит притормозить там, а не везде.
Сервисы слежки за ценами и no-code парсеры (Octoparse, Web Scraper) берут список прокси в настройках — вставьте тот же файл ip:port. Даже Google Sheets IMPORTXML можно пустить через небольшой прокси-релей для лёгких проверок.
Пул держите свежим прокси-чекером, а схему обкатайте на бесплатных прокси до полного каталога.



Ежечасный обход каталога выгоднее на безлимитном пакете. Магазинам со строгой защитой и ценам по городам нужны резидентные адреса.
Каталог каждый часЛучший выбор
Карточка товара встречает тот же IP примерно раз в месяц при ежечасной проверке. Полные страницы не увеличивают счёт.
$990 в месяцили $4.20 в час
Строгие магазины
Домашний IP страны магазина на каждый запрос. Для площадок, которые показывают адресам из списков капчу вместо цены.
от $0.49 за ГБ1 ГБ за $0.85
Цены по городам
Город и регион в строке подключения. Магазин показывает цену и доставку, какие видит покупатель этого города.
от $1.39 за ГБ1 ГБ за $2.29
Выберите пакет, возьмите бесплатный час, прогоните трекер по всему каталогу.