1. 导读

    当目标站点把“地理围栏 + 行为检测”做成组合拳之后,爬虫工程师 80 % 的精力被迫从业务逻辑转向“如何像真人一样上网”。本文以 Python 为主语言,演示怎样把 Novproxy 的 1 亿+ 海外住宅 IP 嵌入到“调度 → 指纹 → 监控 → 容灾”完整链路,把 99 % 拦截率压到 5 % 以下,同时把单次请求成本控制在 0.0004 USD(0.5 USD/GB ÷ 1 MB 平均页面)。

  2. 海外 IP 在爬虫中的 4 个不可替代场景
    1) 地理定向内容:航空公司根据 IP 决定币种与税费;不挂当地 IP 直接返回 403。
    2) 价格反爬:电商给数据中心 IP 返回“幽灵价”,比真实价高 8–15 %。
    3) 账号隔离:社交矩阵运营需要“1 国 1 IP 1 账号”,否则触发关联封号。
    4) 训练数据合规:多模态 LLM 爬取欧盟境内图片必须满足 GDPR“本地采集、本地存储”条款,用当地住宅 IP 是最低成本合规手段。
  3. 代理选型:为什么直接上“住宅 IP”而不是“机房 IP”

    检测维度 → 机房 IP 住宅 IP

    ASN 类型 → IDC / Hosting ISP / Residential

    rDNS → server.hosting.com .residential.isp.net

    端口开放 → 80/443/22 全封 仅 80/443

    时延分布 → 5 ms 内簇 30–300 ms 长尾

    结论:机房 IP 在 0 RTT 就被 TLS 指纹规则团灭;住宅 IP 至少能进“行为评分”环节,给后续“人味工程”留空间。

  4. 实战:把 Novproxy 接入 Scrapy 中间件

    3.1 账号与认证

    Novproxy 给的是“子账号”模式,用户名格式 user-spider001-zone-res-country-us-city-newyork-sessdur-30,密码固定。好处是“把调度信息直接写进用户名”,省掉额外 API 调用。

    3.2 中间件代码(可直接放 middlewares.py)

import base64, random, redis, time
from w3lib.http import basic_auth_header
from scrapy import signals
from twisted.internet.error import TCPTimedOutError

class NovproxyMiddleware:
    def __init__(self, redis_host, redis_port):
        self.r = redis.Redis(host=redis_host, port=redis_port, decode_responses=True)
        # 拉取“可用 IP 队列”,key 格式 novproxy:good:<country>
        self.country = 'us'

    @classmethod
    def from_crawler(cls, crawler):
        o = cls(crawler.settings['REDIS_HOST'], crawler.settings['REDIS_PORT'])
        crawler.signals.connect(o.spider_opened, signal=signals.spider_opened)
        return o

    def spider_opened(self, spider):
        # 预加热 200 条 IP 放进池子,避免冷启动
        for _ in range(200):
            self.r.lpush(f'novproxy:good:{self.country}', self._build_proxy_url())

    def _build_proxy_url(self):
        zone = random.choice(['res', 'isp'])          # res=旋转住宅, isp=静态 ISP
        sess_time = random.randint(1, 120)            # 分钟
        user = f'user-spider001-zone-{zone}-country-{self.country}-sessdur-{sess_time}'
        pwd = 'novproxy_pwd'
        return f'http://{user}:{pwd}@gw.novproxy.com:8888'

    def process_request(self, request, spider):
        url = self.r.lpop(f'novproxy:good:{self.country}')
        if not url:                       # 池子空了,实时补一条
            url = self._build_proxy_url()
        request.meta['proxy'] = url
        # 把“过期时间”写进 meta,给重试逻辑用
        request.meta['sess_expire'] = time.time() + 60 * int(url.split('sessdur-')[1].split('-')[0])

    def process_exception(self, request, exception, spider):
        # 超时/407/521 直接判死刑,不回流
        if isinstance(exception, (TCPTimedOutError,)):
            return
        # 其他异常回流,给 2 次重试机会
        retry_times = request.meta.get('retry_times', 0)
        if retry_times < 2:
            request.meta['retry_times'] = retry_times + 1
            self.r.rpush(f'novproxy:good:{self.country}', request.meta['proxy'])
            return request

3.3 settings.py 关键项

DOWNLOADER_MIDDLEWARES = {'myproject.middlewares.NovproxyMiddleware': 350}
RETRY_TIMES = 0          # 我们自己算重试
DOWNLOAD_TIMEOUT = 12    # 住宅网 90 分位 RTT 约 600 ms,留 20 倍余量
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379

3.4 压测结果

单机 100 并发,目标 https://www.target.com/api/price,10 min 内 62 k 请求,成功 59.4 k,可用率 95.8 %,平均下载 280 ms,带宽成本 0.49 USD。

  1. 指纹对抗:把“住宅 IP”升级成“真人会话”

    4.1 TLS/JA3 指纹

    用 curl-impersonate 或 requests-impersonate,直接模拟 Chrome 114 的 JA3。Novproxy 支持 HTTP/SOCKS5 两种上游,走 SOCKS5 时把 TLS 指纹 offload 到本地,可以避免“中间人指纹”被识别。

    4.2 HTTP/2 指纹

    目标站点如果要求 h2,用 hyper 或者 aiohttp+h2 插件,把 SETTINGS_HEADER_TABLE_SIZE、WINDOW_UPDATE 帧顺序固定成 Chrome 值。

    4.3 画布 & WebGL

    Playwright 打开页面前先加载 Chrome 插件 fp-scrambler,把画布 hash 随机化;同时把 WebGL vendor 改成 Intel Inc.,renderer 改成 Intel Iris OpenGL Engine,与住宅 IP 的“家庭宽带”场景一致。

    4.4 行为节奏

    采用“人形泊松”间隔:

    think_time = numpy.random.poisson(lam=4) + random.uniform(0, 1)

    把 lam 设成 4,实测 90 % 间隔落在 2–7 s,与 SimilarWeb 给出的“电商详情页停留”分布吻合。

  2. 调度层:动态权重 + 熔断 + 国别容灾

    5.1 权重公式

    score = (1 − fail_rate) × √speed × log10(left_ips)

    每 30 s 重算一次,把分最低的 10 % IP 下线。

    5.2 熔断策略

    连续 3 次 HTTP 407/521 或 TCP 超时,立即熔断该 IP 10 min;同时把对应 /24 网段降权 50 %,防止整 C 段被团灭。

    5.3 国别容灾

    当 us 池子可用 IP < 500 时,自动把 country 参数切到 ca/mx,保证“北美价格带”业务不断流;Novproxy 的美加墨三国池子总量 1 600 万,可以无缝漂移。

  3. 监控与可观测

    6.1 指标

    • novproxy_ip_fail_rate
    • novproxy_ip_response_95pct
    • bandwidth_cost_usd

    用 Prometheus + Grafana,带宽成本实时折到“每千次请求”粒度。

    6.2 告警

    fail_rate > 5 % 且持续 5 min → 飞书机器人;

    bandwidth_cost > 0.001 USD/req → 自动限速 50 %。

    6.3 日志追溯

    每次请求把 proxy 用户名、目标 host、status、fail_reason 写进 Loki,方便回捞复盘。

  4. 合规小结
    1) 遵守 robots.txt、不碰个人信息;
    2) 欧盟采集用当地住宅 IP,加双重加密存储;
    3) 与 Novproxy 签 DPA(Data Processing Addendum),满足 GDPR 第 28 条“数据处理者”义务;
    4) 对外提供数据产品前做 GDPR 评估(DPIA),留痕 10 年。
  5. 一句话总结

    当目标站点把“IP 质量”设为第一门槛时,住宅代理就是基础设施,而不是可选项。把 Novproxy 的 1 亿+ 海外 IP 封装成“调度 → 指纹 → 监控”三板斧,就能把 99 % 的 403/521/Challenge Page 压到 5 % 以内,让工程师重新把注意力放回“业务字段解析”,而不是“如何上网”。


附:速查清单(Copy & Run)

  • 试用 500 MB:找官网右侧客服说“spider trial”,会送 0.99 USD 代金券,刚好跑 1 GB。
  • 最快上手命令:
curl -x http://user-spider001-zone-res-country-us-sessdur-10:pwd@gw.novproxy.com:8888 \
     -L https://ipinfo.io
  • Scrapy 模板仓库:github.com/yourname/novproxy-scrapy-template(把上面 middlewares.py 放进去即可)。

Novproxy
1 声望1 粉丝