Разделите по маркетплейсу и стране
Один список на рынок: оставьте строки CSV этой страны и дайте каждому парсеру свой файл ip:port.
Интернет-торговля живёт на чужих данных: остатки конкурентов, их цены, их карточки такими, какими их видят покупатели в каждой стране. Маркетплейсы режут адреса из списков строже других сайтов, поэтому основной обход идёт через Resi Core с домашним IP нужной страны, а безлимитные пакеты закрывают магазины попроще и большой объём.
Маркетплейсы самые защищённые сайты в сети. Пул должен быть большим, местным и свежим.
Карточки такими, какими их видит местный покупатель
Resi Core: домашний IP страны рынка; Resi Prime добавляет город и срок доставки
Проверки остатков и цен по тысячам SKU
Потоки на Resi без лимита, на пакетах до 2 500
Адреса, которые переживают бан маркетплейса
Пул Resi Core больше 2 млн адресов, на каждый запрос новый IP
Полные страницы с картинками и отзывами
На безлимитных пакетах трафик не считается; на Resi отключайте картинки и платите только за HTML
Отключите в парсере картинки и скрипты, тогда гигабайт уходит на HTML карточек. Цена за ГБ падает с объёмом заказа.
| Объём заказа | Resi Core | Resi Prime |
|---|---|---|
| от 1 ГБ | $0.85 | $2.29 |
| от 10 ГБ | $0.79 | $2.09 |
| от 50 ГБ | $0.72 | $1.95 |
| от 100 ГБэкономия 24% | $0.65 | $1.75 |
| от 500 ГБ | $0.57 | $1.55 |
| от 1000 ГБ | $0.49 | $1.39 |
Цены в долларах США за 1 ГБ. Трафик покупается целым числом гигабайт, от 1 ГБ.
Пул
Экономия 24% ($20.00) против цены от 1 ГБ
Ещё 400 ГБ, и каждый гигабайт выйдет по $0.57
Купить этот объёмГигабайты можно расходовать 3 месяца с даты покупки, потом остаток списывается.
Один список на рынок: оставьте строки CSV этой страны и дайте каждому парсеру свой файл ip:port.
Остатки каждый час, цены дважды в день, карточки раз в сутки. Каждый запрос со следующего адреса в списке.
Пишите цену, флаг наличия, дату доставки и страну IP в каждую запись: страна потом объясняет расхождения.
Заполните products.txt и задайте COUNTRY; каждый товар читается через местный прокси, цена и флаг наличия выдёргиваются и дописываются в stock.csv, накапливая историю для графиков. PRICE_RE и INSTOCK_RE подгоните под маркетплейс.
#!/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()
Соберите отдельный список ip:port на страну маркетплейса из CSV-выгрузки и дайте каждому парсеру свой файл. Отправляйте с региональным IP куку страны самого маркетплейса; часть площадок читает регион из куки раньше адреса.
Остатки берите со страницы товара или из корзины, а не из поиска, который кешируется, и при 403 притормаживайте по конкретному маркетплейсу, а не глобально.
Трекер выше запускайте из cron и дописывайте в один CSV, накапливая историю для графиков. Пишите страну IP в каждую запись; страна потом объясняет расхождения в цене и доставке.
Пул держите свежим Socks List Processor, а парсер обкатайте на бесплатных прокси до полного каталога.



Крупные маркетплейсы обходите через Resi Core, кабинет продавца и цены по городам держите на Resi Prime, а магазины попроще дешевле снимать безлимитным пакетом.
Обход маркетплейсовЛучший выбор
Домашний IP страны рынка на каждый запрос, поэтому бан одного адреса не останавливает обход. Купленные гигабайты расходуете три месяца.
от $0.49 за ГБ1 ГБ за $0.85
Кабинет продавца и город
Кабинет продавца сидит на одном домашнем IP до 24 часов. Город и провайдер в строке показывают цену и срок доставки, какие видит покупатель этого города.
от $1.39 за ГБ1 ГБ за $2.29
Магазины попроще и объём
Трафик не считается, поэтому полные карточки с картинками не увеличивают счёт. Подходит магазинам, которые не режут адреса из списков.
$397 в месяцили $2.20 в час
Возьмите Resi Core под маркетплейсы, проверьте парсер на 1 ГБ и запустите трекер на каждом рынке, где продаёте.