按平台和国家拆分
每个市场一份列表:保留该国的 CSV 行,给每个采集器一个独立的 ip:port 文件。
电商平台是网上防护最严的网站。代理池必须够大、够本地、够新。
看到本地买家看到的商品页
Resi Core:市场所在国家的家庭IP;Resi Prime还可加上城市和配送日期
在数千个 SKU 上检查库存和价格
Resi不限线程,套餐最多2500
扛得过平台封禁的地址
Resi Core代理池有2M+地址,每次请求换新IP
带图片和评价的完整页面
不限流量套餐不计流量;用Resi时关闭图片,只为HTML付费
在采集器中关闭图片和脚本,GB就只花在商品页HTML上。每GB价格随订单增大而降低。
| 订单大小 | Resi Core | Resi Prime |
|---|---|---|
| 1GB+ | $0.85 | $2.29 |
| 10GB+ | $0.79 | $2.09 |
| 50GB+ | $0.72 | $1.95 |
| 100GB+省24% | $0.65 | $1.75 |
| 500GB+ | $0.57 | $1.55 |
| 1000GB+ | $0.49 | $1.39 |
价格为每1GB的美元价格。按整GB购买,最少1GB。
代理池
相比1GB起的价格,您节省24%($20.00)
再加400GB,每GB就降到$0.57
购买此数量购买的GB自购买之日起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 时一并发送平台的国家 Cookie;有些网站先从 Cookie 读取地区,再看地址。
库存从商品页或购物车取,不要用会被缓存的搜索结果;出现 403 时按平台放慢,而不是全局放慢。
用 cron 运行上面的监控脚本,并追加到同一个 CSV 中,逐步形成可画图的历史。每条记录都写上 IP 所在国家;之后价格和配送的差异就靠它来解释。
用Socks List Processor 保持代理池新鲜,跑完整目录前先用免费代理列表试一下采集器。



大型电商平台用Resi Core抓取,卖家账号和城市价格放在Resi Prime上,较简单的商店用不限流量套餐采集更便宜。
电商平台抓取最佳选择
每次请求都用市场所在国家的家庭IP,一个地址被封也不会让抓取停下来。购买的GB可在三个月内用完。
低至 $0.49 每GB1GB仅需$0.85
卖家账号和城市
卖家账号可在一个家庭IP上保持长达24小时。字符串中的城市和运营商能显示该城市买家看到的价格和配送日期。
低至 $1.39 每GB1GB仅需$2.29
简单商店和大流量
流量不计量,带图片的完整商品页也不会增加费用。适合不封锁列表地址的商店。
$397 每月或每小时$2.20