-
導讀
當目標站點把“地理圍欄 + 行為檢測”做成組合拳之後,爬蟲工程師 80 % 的精力被迫從業務邏輯轉向“如何像真人一樣上網”。本文以 Python 為主語言,演示怎樣把 Novproxy 的 1 億+ 海外住宅 IP 嵌入到“調度 → 指紋 → 監控 → 容災”完整鏈路,把 99 % 攔截率壓到 5 % 以下,同時把單次請求成本控制在 0.0004 USD(0.5 USD/GB ÷ 1 MB 平均頁面)。
- 海外 IP 在爬蟲中的 4 個不可替代場景
1) 地理定向內容:航空公司根據 IP 決定幣種與税費;不掛當地 IP 直接返回 403。
2) 價格反爬:電商給數據中心 IP 返回“幽靈價”,比真實價高 8–15 %。
3) 賬號隔離:社交矩陣運營需要“1 國 1 IP 1 賬號”,否則觸發關聯封號。
4) 訓練數據合規:多模態 LLM 爬取歐盟境內圖片必須滿足 GDPR“本地採集、本地存儲”條款,用當地住宅 IP 是最低成本合規手段。 -
代理選型:為什麼直接上“住宅 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 至少能進“行為評分”環節,給後續“人味工程”留空間。
-
實戰:把 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。
-
指紋對抗:把“住宅 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 給出的“電商詳情頁停留”分佈吻合。
-
調度層:動態權重 + 熔斷 + 國別容災
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 萬,可以無縫漂移。
-
監控與可觀測
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,方便回撈覆盤。
- 合規小結
1) 遵守 robots.txt、不碰個人信息;
2) 歐盟採集用當地住宅 IP,加雙重加密存儲;
3) 與 Novproxy 籤 DPA(Data Processing Addendum),滿足 GDPR 第 28 條“數據處理者”義務;
4) 對外提供數據產品前做 GDPR 評估(DPIA),留痕 10 年。 -
一句話總結
當目標站點把“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 放進去即可)。