قسّم حسب السوق والدولة
قائمة لكل سوق: أبقِ صفوف CSV لتلك الدولة وأعطِ كل محلل ملف ip:port خاصًا به.
تعيش التجارة الإلكترونية على بيانات الآخرين: مخزون المنافسين وأسعارهم وصفحات منتجاتهم كما يراها المشترون في كل دولة. والأسواق الإلكترونية تقطع عناوين القوائم أشد من المواقع الأخرى، لذا يمر الزحف الرئيسي عبر Resi Core بعنوان IP منزلي من الدولة المطلوبة، بينما تغطي الباقات غير المحدودة المتاجر الأبسط والأحجام الكبيرة.
الأسواق الإلكترونية أكثر المواقع حماية على الويب. يجب أن تكون المجموعة كبيرة ومحلية ومتجددة.
صفحات المنتجات كما يراها المشتري المحلي
Resi Core: عنوان IP منزلي من بلد السوق؛ ويضيف Resi Prime المدينة وتاريخ التوصيل
فحص المخزون والأسعار عبر آلاف المنتجات
بلا حد للخيوط في Resi، وحتى 2500 في الباقات
عناوين تصمد أمام حظر السوق الإلكتروني
مجمّع 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 غيغابايت. تشتري غيغابايتات كاملة، بدءًا من واحد.
المجمّع
توفّر 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()
ابنِ من تصدير CSV قائمة ip:port منفصلة لكل دولة سوق، وأعطِ كل محلل ملفه الخاص. أرسل ملف تعريف ارتباط الدولة الخاص بالسوق مع 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 غيغابايت، وشغّل المتابعة على كل سوق تبيع فيه.