Python 爬虫代理 IP 的池子该怎么自己管-易代理
为啥有些团队不用动态网关
动态转发网关省事,但有些场景要自己控。比如按业务打标、按城市筛、按失败率淘汰、把某些地址锁给指定任务。这时候就得自己维护 Python 爬虫代理 IP 池。
池子不是“存一堆地址”这么简单。它要有获取、校验、使用、失败扣分、冷却、补充、统计这几件事。
池子的最小模型
pythonimport timeimport randomclass ProxyPool: def __init__(self): self.items = {} # addr -> meta
def add(self, addr): self.items[在] = { "addr": addr, "score": 100, "last_used": 0, "cool_until": 0,
} def get(self):
now = time.time()
ready = [
m for m in self.items.values() if m["score"] > 0 and m["cool_until"] <= now
] if not ready: return None
m = random.choice(ready)
m["last_used"] = now return m["addr"] def fail(self, addr):
m = self.items.get(addr) if m:
m["score"] -= 20
m["cool_until"] = time.time() + 300
def ok(self, addr):
m = self.items.get(addr) if m:
m["score"] = min(100, m["score"] + 5)Python 爬虫代理 IP 池的核心不是“多”,是“脏了能踢、好了能回、分数能反映历史”。
入库前先校验
从 API 拉下来的地址别直接上生产。先打一个轻量检测接口:
pythondef check_proxy(addr):
proxies = {"http": f"http://{addr}", "https": f"http://{addr}"} try:
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=8) return r.status_code == 200
except Exception: return False不校验就上量,爬虫前十分钟全在超时。Python 爬虫代理 IP 的可用率,是验出来的,不是服务商海报写出来的。
按业务打标签
池子可以带 tag:
pythonself.items[addr] = { "addr": addr, "tags": ["news"], "score": 100,
}新闻采集取 news 标签,价格监控取 price 标签,SERP 取 serp 标签。不同业务用不同出口,避免一类任务把另一类任务拖下水。
定时补充和定时瘦身
pythondef refresh_pool(pool): new_list = pull_from_api(count=20) for addr in new_list: if check_proxy(addr): pool.add(addr) dead = [a for a, m in pool.items.items() if m["score"] <= 0] for a in dead: del pool.items[a]
Python 爬虫代理 IP 池要流动起来。只进不出,池子会腐烂;只出不进,任务会饿死。
和 Scrapy、aiohttp 怎么接
Scrapy 中间件里:
pythonproxy = pool.get()
request.meta["proxy"] = f"http://{proxy}"request.meta["_pool_addr"] = proxy响应失败里:
pythonpool.fail(request.meta.get("_pool_addr"))aiohttp 里同理,每次请求前拿一个地址,异常就扣分。Python 爬虫代理 IP 池不是独立组件,它要嵌进框架生命周期里才值钱。
小结
自己管池子比用网关累,但控制力强。评分、冷却、标签、校验、补充、瘦身,这六件事做全,Python 爬虫代理 IP 池才是生产资产,不是 Excel 里的一列地址。
相关标签:代理ip,ip代理,http代理,代理服务器ip,开放代理,文档中心,新闻,动态住宅ip,ip池,socks5代理