MIX-Basic
8,000 IP · 500–900 线程
每月 $50 起
一个项目:抓取十万以内的 URL、收词、每周查一次链接。
爬虫用几百个线程抓整站,任何服务器早晚都会回它一个 429。最多 25,000 个 IP 的 MIX 代理池把这些线程分散到不同地址上,所以 Screaming Frog、Netpeak Spider、A-Parser 和 Key Collector 能全速跑,而不是单线程加延时。1 小时测试 $1。

选择套餐,拖动时长和线程数。这里的线程就是您在爬虫设置里填的 threads:1,200 线程就是工具同时抓取的 1,200 个 URL。滑块就停在这个值上。
MIX-Basic 适合一个项目的审计:在 Screaming Frog 或 Netpeak Spider 里抓 5 万到 10 万个 URL,用 Key Collector 收词,偶尔查一次死链。8,000 个地址能绕开服务器的限制,500 线程也和爬虫里常填的数字相当。
MIX-Business 面向 SEO 部门和代理机构:每周几个项目,Sitebulb 和 SEO PowerSuite 同时开,A-Parser 收下拉词和搜索结果,ScrapeBox 做批量检查。16,000 个地址、默认 1,200 线程:想让抓取一个傍晚跑完而不是跑一整夜,填的就是这个数。
MIX-Elite 为自建服务或大型内部团队而生:每轮抓取上百万 URL,日志分析和爬取同时进行,自己写的收录和分页检查器。25,000 个地址的代理池,线程可到 9,900 — 这个量级别的套餐都达不到。
一个线程即一个并发连接。线程越多,同样时间内完成得越多。
1个月 $50线程无额外费用
比按天省 $250一个线程即一个并发连接。线程越多,同样时间内完成得越多。
1个月 $100+ 线程 $20
比按天省 $420一个线程即一个并发连接。线程越多,同样时间内完成得越多。
1个月 $150线程无额外费用
比按天省 $450权限绑定在这台电脑或服务器本身,所以在 Screaming Frog 和 Netpeak 的代理设置里,用户名和密码留空即可。这样的机器最多十台。
链接返回的文本是「地址加端口」的格式,每行一个代理。Screaming Frog 和 Netpeak 要的是同样的列表,只是要文件:把返回内容存成 .txt,在设置里指向它。
A-Parser 和 ScrapeBox 会自己重新读取链接,把里面所有地址都拿走。Key Collector、Sitebulb 和 SEO PowerSuite 读的是列表文件,所以用脚本每 10 分钟刷新一次,示例见下面。
Basic 500,Business 1,000,Elite 不加购 1,500。每个端口都是独立代理,爬虫的一个线程占一个端口:在 Screaming Frog 里填得比端口还多没有意义。
Screaming Frog、A-Parser、ZennoPoster 和 ScrapeBox 走 SOCKS5。Netpeak Spider、Key Collector 和 SEO PowerSuite 走 HTTP(S)。两种协议都在同一个端口上,只在工具里切换。
代理池接自建审计的方法如下。脚本从 urls.txt 读取地址,通过随机的代理抓取每个页面,把响应码、跳转、title、h1、描述、canonical 和 robots 写进 audit.csv —— 和爬虫给出的东西一样,只是按您的规则来。把 PROXY_LIST_URL_FROM_DASHBOARD 换成控制台里的链接。
# pip install requests[socks]
import csv, random, re, time, requests
from concurrent.futures import ThreadPoolExecutor
PROXY_LIST_URL = "PROXY_LIST_URL_FROM_DASHBOARD"
REFRESH_SEC = 600
THREADS = 1200
HEADERS = {"User-Agent": "Mozilla/5.0 (compatible; SeoAudit/1.0)", "Accept-Language": "en-US,en;q=0.9"}
_pool, _loaded = [], 0
def pool():
global _pool, _loaded
if time.time() - _loaded > REFRESH_SEC:
text = requests.get(PROXY_LIST_URL, timeout=15).text
_pool = [line.strip() for line in text.splitlines() if ":" in line]
_loaded = time.time()
return _pool
def first(pattern, html):
match = re.search(pattern, html, re.S | re.I)
return re.sub(r"\s+", " ", re.sub(r"<[^>]+>", " ", match.group(1))).strip() if match else ""
def audit(url, tries=3):
for _ in range(tries):
proxy = random.choice(pool())
try:
r = requests.get(url, headers=HEADERS, timeout=20, allow_redirects=False,
proxies={"http": f"socks5h://{proxy}", "https": f"socks5h://{proxy}"})
except requests.RequestException:
continue
html = r.text if "html" in r.headers.get("Content-Type", "") else ""
return {
"url": url,
"status": r.status_code,
"redirect": r.headers.get("Location", ""),
"title": first(r"<title[^>]*>(.*?)</title>", html),
"h1": first(r"<h1[^>]*>(.*?)</h1>", html),
"description": first(r'<meta[^>]+name="description"[^>]+content="([^"]*)"', html),
"canonical": first(r'<link[^>]+rel="canonical"[^>]+href="([^"]*)"', html),
"robots": first(r'<meta[^>]+name="robots"[^>]+content="([^"]*)"', html),
}
return {"url": url, "status": 0, "redirect": "", "title": "", "h1": "",
"description": "", "canonical": "", "robots": ""}
urls = [line.strip() for line in open("urls.txt") if line.strip()]
fields = ["url", "status", "redirect", "title", "h1", "description", "canonical", "robots"]
with open("audit.csv", "w", newline="", encoding="utf-8") as out:
writer = csv.DictWriter(out, fieldnames=fields, delimiter=";")
writer.writeheader()
with ThreadPoolExecutor(THREADS) as executor:
for row in executor.map(audit, urls):
writer.writerow(row)
print(row["status"], row["url"], row["title"][:60])
8,000 IP · 500–900 线程
每月 $50 起
一个项目:抓取十万以内的 URL、收词、每周查一次链接。
16,000 IP · 1,000–1,400 线程
每月 $100 起
代理机构和 SEO 部门:几个爬虫同时跑,收下拉词和批量检查共用一个代理池。
25,000 IP · 1,500–9,900 线程
每月 $150 起
自建服务和大型内部团队:每轮上百万 URL、线程到 9,900、全天候运行。
import csv, io, requests
CSV_URL = "PROXY_LIST_URL_FROM_DASHBOARD.csv"
TAKE = 1200
OUT_FILE = "proxies_fast.txt"
text = requests.get(CSV_URL, timeout=15).text
rows = list(csv.DictReader(io.StringIO(text), delimiter=";"))
rows.sort(key=lambda r: int(r["speed"]), reverse=True)
picked = [f"{r['ip']}:{r['port']}" for r in rows[:TAKE]]
with open(OUT_FILE, "w") as f:
f.write("\n".join(picked) + "\n")
print(f"{len(picked)} proxies saved to {OUT_FILE}")