原理讲解2026年9月29日阅读约 7 分钟

按 GB 计费的代理怎么算钱,以及怎么估算一次抓取的花费

一个公式加一段简短的脚本,在你下单买流量之前,估算一次抓取任务在按 GB 计费的代理上会用掉多少 GB。

「我需要多少 GB?」是我们在 Discord 里被问得最多的问题,老实的回答是:这取决于你的页面。好在它所依赖的那个量,你大约十分钟就能测出来,再把它变成一个误差在合理范围内、可以信赖的估算。

这篇讲的是按 GB 计费,也就是我们住宅代理的卖法。ISP 和数据中心按 IP 和期限计价;按 IP 的套餐包含哪些流量,见价格页。

按 GB 的用量表算的是什么

代理夹在你和网站之间,所以网站发回给你的每一个字节它都看得到。各家服务商在细节上不一样,而账单出错恰恰出在细节上:

  • 算哪个方向。 有的连你发出去的也算,有的只算收到的。我们只算响应:正文加响应头,在我们的代理上测量。
  • 失败的请求。 超时或连接重置什么都不会返回。在我们这儿,这些请求以及我们自己网关返回的错误(比如 407 或 502)都计零,并且照样在日志里标为免费。网站发回来的 429 或 5xx 页面是响应,它的字节要计费。
  • 带正文的封锁。 403 页面或验证码是带着 HTML 回来的,所以它和任何响应一样都是流量,在我们这儿如此,在别家也一样。

完整规则见计量部分。不管你买谁家的,估算之前先找到他们的这份清单。

公式

GB 数 ≈ 页面数 × 平均页面大小 × (1 + 重试比例) ÷ 1,000,000,000
花费  ≈ GB 数 × 你的每 GB 单价
  • 页面数是任务需要的响应数量,列表页、详情页、以及任何你会抓两次的页面都算上。
  • 平均页面大小是一次响应在线路上的字节数,包括响应头。下面会教你测。
  • 重试比例是额外多出来、带着你不想要的正文回来的响应所占的比例,比如封锁页和验证码。从之前跑过的任务里取,或者先保守地猜一个,跑完第一批再修正。
  • 你的每 GB 单价来自价格页。订单越大单价越低,所以看和你打算购买的数量对应的那一档。

测平均页面大小

取二十个左右和任务相像的 URL:按你实际会抓的比例,混合各种页面类型。然后通过代理去称它们的重量,在客户端解压之前读取压缩后的字节。

import requests

PROXY = "http://USERNAME:PASSWORD@HOST:PORT"
PROXIES = {"http": PROXY, "https": PROXY}
HEADERS = {"Accept-Encoding": "gzip, deflate"}


def wire_bytes(url):
    r = requests.get(url, proxies=PROXIES, headers=HEADERS, stream=True, timeout=30)
    body = r.raw.read(decode_content=False)
    head = sum(len(k) + len(v) + 4 for k, v in r.headers.items())
    return len(body) + head


sample = [line.strip() for line in open("sample-urls.txt") if line.strip()]
weights = [wire_bytes(url) for url in sample]
average = sum(weights) / len(weights)
print(f"average response on the wire: {average / 1000:.1f} KB")

pages = int(input("How many responses will the job need? "))
retry_share = float(input("Extra unwanted responses, as a fraction (for example 0.05): "))
gigabytes = pages * average * (1 + retry_share) / 1_000_000_000
print(f"estimated traffic: {gigabytes:.2f} GB")

rate = float(input("Your rate per GB from the pricing page: "))
print(f"estimated cost: {gigabytes * rate:.2f}")

HOST、PORT、USERNAME 和 PASSWORD 在我们控制台里该服务的页面上。取样本身会花一点流量,这正是用意所在:花几个页面的钱,省掉对几十万个页面的瞎猜。

影响最大的几个因素

压缩。 只要你要求,多数网站会用 gzip 发送 HTML,大小往往只有解压后的一小部分。多数 HTTP 库默认就会要求。如果你把它关了,或者你的工具把这个请求头去掉了,你可能在为好几倍于需要的字节付钱。

用浏览器而不是直接请求。 无头浏览器会下载页面要求的脚本、字体、图片和统计请求。一个页面因此可能比它单纯的 HTML 重上很多倍。如果你只要 HTML,就直接请求它,或者屏蔽你用不到的资源类型。

选哪个接口。 很多网站的数据是从一个你自己也能调用的 JSON 接口加载的。一个 JSON 响应通常只有渲染它的那个页面的一小部分。

同一个东西抓两遍。 会回头重抓的翻页循环,以及遇到软封锁后的重试,都会让页面数膨胀。后者见重试不烧流量。

拿估算去对用量表

第一批真实任务先跑小一点,然后对比三个数:你的估算、你自己数的字节、控制台上的数字。如果你数的和控制台一致而估算偏了,就修正输入重新估。如果你数的和控制台对不上,那是另一回事了,从怎么核对服务商的用量表开始。

拿不准输入该填什么?把页面类型和大概数量贴到 Discord,我们帮你估,包括在小单就够的时候直接告诉你。

还有后续问题?

去 Discord 问。答案还能帮到下一个读到这个帖子的人。

加入 Discorddiscord.gg/proxypanda
$5 起步去 Discord 问