Розділіть за маркетплейсом і країною
Один список на ринок: лишіть рядки 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 ГБ і запустіть трекер на кожному ринку, де продаєте.