代理池健康检查与TLS指纹伪装实践

住宅代理IP在使用中常遇到部分节点失效、请求被识别的问题。本文实现一个具备健康检查机制的代理池,并集成curl_cffi进行TLS指纹伪装,提升采集稳定性。

一、代理池健康检查

1.1 单代理检测

python 复制代码
import requests
import time

def check_proxy(proxy, test_url="https://httpbin.org/ip", timeout=5):
    """检测代理是否可用,返回延迟或None"""
    proxies = {"http": proxy, "https": proxy}
    try:
        start = time.time()
        r = requests.get(test_url, proxies=proxies, timeout=timeout)
        if r.status_code == 200:
            return time.time() - start
    except:
        pass
    return None

1.2 并发检测与轮询池

python 复制代码
import random
from concurrent.futures import ThreadPoolExecutor, as_completed

class ProxyPool:
    def __init__(self, proxy_list, max_workers=10):
        self.proxy_list = proxy_list

        self.available = [ ]

        self._update_available(max_workers)
    
    def _update_available(self, workers):
        results = {}
        with ThreadPoolExecutor(max_workers=workers) as ex:
            futures = {ex.submit(check_proxy, p): p for p in self.proxy_list}
            for f in as_completed(futures):
                lat = f.result()
                if lat is not None:
                    results[futures[f]] = lat
        self.available = sorted(results.items(), key=lambda x: x[1])
    
    def get(self):
        if not self.available:
            return None
        return random.choice(self.available)[0]

二、TLS指纹伪装

使用curl_cffi替代requests,模拟真实浏览器指纹。

python 复制代码
from curl_cffi import requests as curl_requests

def fetch(url, proxy=None):
    kwargs = {"impersonate": "chrome120"}
    if proxy:
        kwargs["proxies"] = {"http": proxy, "https": proxy}
    resp = curl_requests.get(url, **kwargs)
    return resp.text

对比测试:

csharp 复制代码
# 普通requests
r = requests.get("https://tls.browserleaks.com/json")
print(r.json().get("ja3_hash"))  # 固定短哈希

# curl_cffi伪装
r2 = curl_requests.get("https://tls.browserleaks.com/json", impersonate="chrome120")
print(r2.json().get("ja3_hash"))  # 与真实Chrome一致

三、完整采集器示例

python 复制代码
import time
import random

def worker(url, proxy_pool, max_retry=3):
    for _ in range(max_retry):
        proxy = proxy_pool.get()
        if not proxy:
            time.sleep(2)
            continue
        try:
            text = fetch(url, proxy=proxy)
            return text
        except Exception as e:
            print(f"失败: {proxy} -> {e}")
            time.sleep(random.uniform(1, 3))
    return None

# 示例:使用住宅代理池(如辣椒HTTP提供的代理列表)
proxies = [
    "http://user:pass@host:port",
    # 可添加多个
]
pool = ProxyPool(proxies)
data = worker("https://example.com/api", pool)

四、效果说明

  • 健康检查机制可自动剔除失效IP,维持代理池可用性
  • curl_cffi指纹伪装使TLS握手特征与真实Chrome一致,降低被识别的概率
  • 二者结合能有效延长采集任务的稳定运行时间

本文介绍的技术方案适用于任何标准代理服务商,不涉及具体商业推荐。实际使用中建议定期更新代理列表,并根据目标网站调整请求频率。

相关推荐
John jj12 分钟前
拆解 Telegram 群组频道收录市场:三类方案,一个可运行的评分模型,目前TG中文人工评分加模型评分机制——LetsTG收录“快速”、“无门槛”
大数据·后端·python·深度学习·搜索引擎·django·全文检索
Gopher_HBo30 分钟前
Engine 核心(gin.go)
后端
用户1257585243636 分钟前
为什么队列长度归零,不代表后台异步任务真的跑完了
redis·后端·go
晚安code1 小时前
Java编程规范避坑指南:阿里开发手册15条强制规约实战解析
java·后端
小蒜学长1 小时前
“守望自然”招募志愿者环保行动网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
程序猿老杨2 小时前
MQTT协议深度解析:从ESP32设备端到云端Broker的工程化实践
后端·物联网·芯片
明月_清风2 小时前
显存即正义:不同显存容量能训多大的模型?一文说清硬件边界与训练策略
前端·后端·ai编程
阿kun要赚马内3 小时前
工具在langchain agent中的调用
人工智能·后端·python
IT_陈寒3 小时前
Vite的HMR在我项目上突然失效,排查三天找到离谱原因
前端·人工智能·后端
AINative软件工程3 小时前
LLM 应用的依赖注入工程实践:解耦 Client、Prompt 和 Tool Registry,让 AI 系统真正可测试可替换
后端·llm·前端工程化