影刀RPA IP代理池搭建与自动切换:突破采集频率限制
作者:林焱
单IP频繁采集被封是每个RPA开发者迟早会遇到的问题。这篇讲怎么在影刀流程中自动切换代理IP,让你的采集更稳定、更安全。
什么时候需要代理?
同一个网站短时间内请求超过50次
目标网站有IP级别的频率限制
需要模拟不同地区的用户(比如查不同城市的搜索结果)
采集过程中IP已经被暂时封禁(收到403/429)
方案一:免费代理(不稳定,仅测试用)
importrequestsimportrandomdefget_free_proxy():"""从免费代理网站获取一个代理"""resp=requests.get("https://www.89ip.cn/api/?&tqsl=10&port=&export=&kt=2&ts=1")# 返回:ip:port\r\nip:port...lines=resp.text.strip().split('\r\n')proxy_str=random.choice(lines)return{"http":f"http://{proxy_str}","https":f"http://{proxy_str}"}# 使用代理proxy=get_free_proxy()try:resp=requests.get("https://example.com",proxies=proxy,timeout=5)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:端口"}# 正常使用,底层自动每次请求换IPresp=requests.get("https://example.com",proxies=proxy)代理池管理
如果你的代理是提取式的(一次提取多个IP),需要做池化管理:
importrequestsimportrandomimporttimeclassProxyPool:def__init__(self,api_url,pool_size=10):self.api_url=api_url# 代理提取APIself.proxies=[]self.pool_size=pool_size self.refresh()defrefresh(self):"""从API拉取新代理"""resp=requests.get(self.api_url)ip_list=resp.text.strip().split('\r\n')self.proxies=[f"http://{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_retries=3):"""带重试的请求"""forattemptinrange(max_retries):proxy=self.get_proxy()try:resp=requests.get(url,headers=headers,proxies={"http":proxy,"https":proxy},timeout=10)ifresp.status_code==200:returnrespelifresp.status_codein[403,429]:self.remove_proxy(proxy)# 这个IP被封了except:self.remove_proxy(proxy)# 这个IP不可用time.sleep(1)raiseException(f"请求失败,已尝试{max_retries}个代理")# 使用pool=ProxyPool("https://api.example.com/get_proxy?num=20")forurlinurls:resp=pool.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;q=0.9,en;q=0.8","Accept":"text/html,application/xhtml+xml,*/*"}踩坑实录
坑1:免费代理几乎不可用
免费代理的可用率不到10%,而且速度极慢(几百毫秒到几秒)。如果只是做个实验玩玩可以,生产环境必须用付费代理。几十块钱能用很久,值得。
坑2:代理协议要和目标网站匹配
HTTP代理只能代理HTTP请求,HTTPS代理才能代理HTTPS。不要以为设置了https键就能代理HTTPS:
TEMU店群矩阵自动化运营核价报活动
# 如果是HTTP代理(不支持HTTPS)proxies={"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:随机加入一些无意义的Cookie
- Accept-Encoding:正常声明支持gzip/deflate
- Connection:设置
keep-alive,模拟浏览器复用连接
写在最后
代理是采集流程的保险丝——正常情况用不上,一旦IP被封你没有代理就只能干等。建议提前搭好代理池,至少准备一个隧道代理做备用。采集稳定性的差距,往往就是这一个代理池的差距。