影刀RPA IP代理池搭建与自动切换突破采集频率限制作者林焱单IP频繁采集被封是每个RPA开发者迟早会遇到的问题。这篇讲怎么在影刀流程中自动切换代理IP让你的采集更稳定、更安全。什么时候需要代理同一个网站短时间内请求超过50次目标网站有IP级别的频率限制需要模拟不同地区的用户比如查不同城市的搜索结果采集过程中IP已经被暂时封禁收到403/429方案一免费代理不稳定仅测试用importrequestsimportrandomdefget_free_proxy():从免费代理网站获取一个代理resprequests.get(https://www.89ip.cn/api/?tqsl10portexportkt2ts1)# 返回ip:port\r\nip:port...linesresp.text.strip().split(\r\n)proxy_strrandom.choice(lines)return{http:fhttp://{proxy_str},https:fhttp://{proxy_str}}# 使用代理proxyget_free_proxy()try:resprequests.get(https://example.com,proxiesproxy,timeout5)print(f代理{proxy}可用)except:print(代理不可用换一个)方案二付费代理生产环境推荐拼多多店群自动化报活动上架付费代理稳定、速度快、有专门的API获取。推荐几家快代理kuaidaili.com隧道代理一次请求一个IP芝麻代理zhimaruanjian.com支持按量付费站大爷zdaye.com长/短期代理都有使用快代理的隧道代理最简单一行代码解决importrequests# 快代理隧道代理固定域名端口每次请求自动换IPproxy{http:http://你的订单号:你的密码tunnel.kuaidaili.com:端口,https:http://你的订单号:你的密码tunnel.kuaidaili.com:端口}# 正常使用底层自动每次请求换IPresprequests.get(https://example.com,proxiesproxy)代理池管理如果你的代理是提取式的一次提取多个IP需要做池化管理importrequestsimportrandomimporttimeclassProxyPool:def__init__(self,api_url,pool_size10):self.api_urlapi_url# 代理提取APIself.proxies[]self.pool_sizepool_size self.refresh()defrefresh(self):从API拉取新代理resprequests.get(self.api_url)ip_listresp.text.strip().split(\r\n)self.proxies[fhttp://{ip}foripinip_listifip]print(f代理池刷新{len(self.proxies)}个代理)defget_proxy(self):获取一个代理ifnotself.proxies:self.refresh()returnrandom.choice(self.proxies)defremove_proxy(self,proxy):移除失效代理ifproxyinself.proxies:self.proxies.remove(proxy)defrequest_with_retry(self,url,headers,max_retries3):带重试的请求forattemptinrange(max_retries):proxyself.get_proxy()try:resprequests.get(url,headersheaders,proxies{http:proxy,https:proxy},timeout10)ifresp.status_code200:returnrespelifresp.status_codein[403,429]:self.remove_proxy(proxy)# 这个IP被封了except:self.remove_proxy(proxy)# 这个IP不可用time.sleep(1)raiseException(f请求失败已尝试{max_retries}个代理)# 使用poolProxyPool(https://api.example.com/get_proxy?num20)forurlinurls:resppool.request_with_retry(url,headers)process(resp)User-Agent轮换代理只是第一步User-Agent也要轮换importrandom USER_AGENTS[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/91.0...,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/90.0...,Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/91.0...,Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0,]defget_headers():return{User-Agent:random.choice(USER_AGENTS),Accept-Language:zh-CN,zh;q0.9,en;q0.8,Accept:text/html,application/xhtmlxml,*/*}踩坑实录坑1免费代理几乎不可用免费代理的可用率不到10%而且速度极慢几百毫秒到几秒。如果只是做个实验玩玩可以生产环境必须用付费代理。几十块钱能用很久值得。坑2代理协议要和目标网站匹配HTTP代理只能代理HTTP请求HTTPS代理才能代理HTTPS。不要以为设置了https键就能代理HTTPSTEMU店群矩阵自动化运营核价报活动# 如果是HTTP代理不支持HTTPSproxies{http:http://ip:port}# 只代理HTTP# 如果是HTTPS代理支持connect方法proxies{http:http://ip:port,https:http://ip:port}坑3代理超时设太长代理切换时如果每个超时等30秒10个坏代理就是5分钟。把timeout设成5-8秒快速试错。坑4短效代理频繁提取浪费额度有些代理平台按提取次数收费。不要请求一次提取一次一次提取20个放池子里慢慢用。大多数短效代理的有效期是1-5分钟够你用一阵的。避免被封的其他技巧Referer设置成目标网站的首页看起来像正常浏览Cookie随机加入一些无意义的CookieAccept-Encoding正常声明支持gzip/deflateConnection设置keep-alive模拟浏览器复用连接写在最后代理是采集流程的保险丝——正常情况用不上一旦IP被封你没有代理就只能干等。建议提前搭好代理池至少准备一个隧道代理做备用。采集稳定性的差距往往就是这一个代理池的差距。