Розділіть каталог за магазинами
Кожен магазин отримує свою чергу запитів і свою частку списку проксі. Великим маркетплейсам дістається найбільша частка.
Магазини показують різним регіонам різні ціни і блокують тих, хто надто часто питає з однієї адреси. Трекер цін на Advanced.name розкидає запити по десятках тисяч IPv4-адрес і питає кожен магазин з регіону його покупців.
Трекер щогодини заходить на ті самі сторінки. Саме цей патерн і блокують, і пул має його сховати.
Інший IP на кожен візит до того самого товару
У пакеті №4 30 000 адрес: картка товару бачить той самий IP раз на місяць
Ціни такими, як їх бачать місцеві покупці
Пули Європа, СНД і Китай; Мікс світу для США та інших ринків
Тисячі SKU щогодини
До 2500 потоків на пакеті №4, 5000 на пакеті №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 або з вузла ціни; скрипт вище використовує регулярний вираз, який ви налаштовуєте під кожен магазин. Разом з місцевим IP надсилайте Accept-Language і куку валюти регіону, інакше магазин може перекинути вас на інший ринок.
Розклад за навантаженням: наявність щогодини, ціни двічі на день. Зберігайте HTTP-статус разом з кожною ціною, тоді сплеск 403 від одного магазину підкаже пригальмувати саме там, а не скрізь.
Сервіси стеження за цінами і no-code парсери (Octoparse, Web Scraper) приймають список проксі в налаштуваннях: вставте той самий файл ip:port. Навіть IMPORTXML у Google Sheets може працювати через невеликий проксі-ретранслятор для легких перевірок.
Тримайте пул свіжим за допомогою чекера проксі і перевірте всю схему на безкоштовному списку проксі, перш ніж масштабуватися на повний каталог.



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