代理IP池的动态管理与智能调度:从免费代理到商业代理的实战之路
一、业务背景
在日本代购数据采集和雅虎代拍场景中,IP被限制是最常见的问题。日本电商平台对同一IP的请求频率有严格限制,一旦触发限流,整个爬虫或自动化系统就会停摆。
我最早用的是免费代理IP,从网上爬取公开的代理列表:
python
import requestsfrom bs4 import BeautifulSoupdef fetch_free_proxies(): url = "https://free-proxy-list.net/" response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') proxies = [] for row in soup.select('table tbody tr'): cols = row.find_all('td') if len(cols) >= 2: ip = cols[0].text port = cols[1].text proxies.append(f"{ip}:{port}") return proxies
免费代理的问题很明显:
·
稳定性差:大部分代理几分钟就失效
·
·
速度慢:响应时间经常超过5秒
·
·
被识别率高:很多是数据中心IP,容易被目标网站识别并封禁
·
二、代理的分级管理
我把代理分为三个等级:
python
class ProxyTier: FREE = 'free' # 免费代理:质量最差,仅用于低优先级任务 SHARED = 'shared' # 共享商业代理:质量中等,用于常规任务 DEDICATED = 'dedicated' # 独享代理:质量最高,用于核心任务(如雅虎代拍)class ProxyManager: def __init__(self): self.pools = { ProxyTier.FREE: [], ProxyTier.SHARED: [], ProxyTier.DEDICATED: [] } self.failure_count = {} # 记录每个代理的失败次数 def get_proxy(self, tier=ProxyTier.SHARED): """获取一个可用代理""" pool = self.pools[tier] # 按成功率排序,优先使用成功率高的 pool.sort(key=lambda p: self._get_success_rate(p), reverse=True) for proxy in pool: if self._is_available(proxy): return proxy # 如果当前等级没有可用代理,降级到下一等级 if tier == ProxyTier.DEDICATED: return self.get_proxy(ProxyTier.SHARED) elif tier == ProxyTier.SHARED: return self.get_proxy(ProxyTier.FREE) return None
三、代理的健康检查与自动淘汰
python
import asyncioimport aiohttpclass ProxyHealthChecker: def __init__(self, manager): self.manager = manager self.test_url = "https://httpbin.org/ip" async def check_proxy(self, proxy): """检查单个代理是否可用""" try: async with aiohttp.ClientSession() as session: async with session.get( self.test_url, proxy=f"http://{proxy}", timeout=5 ) as resp: if resp.status == 200: return True except: pass return False async def health_check_all(self): """定期检查所有代理的健康状态""" while True: for tier in [ProxyTier.DEDICATED, ProxyTier.SHARED, ProxyTier.FREE]: pool = self.manager.pools[tier] tasks = [self.check_proxy(p) for p in pool] results = await asyncio.gather(*tasks) # 移除失效的代理 alive = [p for p, is_alive in zip(pool, results) if is_alive] self.manager.pools[tier] = alive await asyncio.sleep(60) # 每分钟检查一次
四、智能路由:根据目标网站选择代理
不同目标网站对代理的要求不同:
python
class SmartRouter: def __init__(self, proxy_manager): self.proxy_manager = proxy_manager def get_proxy_for_target(self, target_url): """根据目标URL选择最合适的代理""" if 'auctions.yahoo.co.jp' in target_url: # 雅虎拍卖:要求高稳定性、低延迟,使用独享代理 return self.proxy_manager.get_proxy(ProxyTier.DEDICATED) elif 'mercari.jp' in target_url: # 煤炉:要求中等,使用共享代理 return self.proxy_manager.get_proxy(ProxyTier.SHARED) elif 'rakuten.co.jp' in target_url: # 乐天:相对宽松,可以使用免费代理 return self.proxy_manager.get_proxy(ProxyTier.FREE) else: return self.proxy_manager.get_proxy(ProxyTier.SHARED)
五、总结
代理IP池的核管理心原则是:分级管理、健康检查、智能路由。独享代理给核心业务(雅虎代拍),共享代理给常规任务,免费代理只做备选。这套方案让代理的可用率维持在95%以上。
- 点赞
- 收藏
- 关注作者
评论(0)