博客 / 詳情

返回

Novproxy出海攻略之從 IP 池到指紋對抗:用海外住宅代理構建高可用數據爬取流水線

  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 放進去即可)。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.