代理IP接入程序的完整流程(Python 实战,附排坑记录)

📅 2026/6/26 4:01:25
代理IP接入程序的完整流程(Python 实战,附排坑记录)
最近项目里需要用到代理IP从选型到跑通代码踩了一些坑把整个过程记录一下希望对同样在做这块的朋友有帮助。我用的是极安代理它有短效代理和隧道代理两种产品。下面的操作和代码都基于这个环境但原理部分是通用的换别的服务商逻辑一样。一、先搞清楚短效代理和隧道代理的区别这两种代理的工作方式完全不同选错了后面的接入方式也不一样所以放在最前面说。短效代理有的平台叫提取式代理、API代理你调一个接口它返回一批IP给你每个IP有存活时间过期作废你得重新提取。相当于你自己管一个IP池。隧道代理有的平台叫旋转代理给你一个固定的代理地址你所有请求都往这个地址发后端自动帮你换IP。你不用关心IP的事。简单对比短效代理隧道代理你拿到什么一条API链接调用返回IP列表一个固定的host:port地址IP怎么换自己管过期了重新提取自动换你不用管代码量多一些要写IP池逻辑少配一次地址就行适合什么场景需要大量不同IP要稳定通道、怕麻烦我的场景需要大量不同IP所以两种都试了。二、获取代理地址这一步很简单。短效代理到极安代理的提取工具页面选好地区、协议、数量页面生成一条API链接复制就行。也可以看接口文档自己拼参数灵活度更高。隧道代理购买后进后台产品列表里直接有隧道地址复制走。三、配置授权验证地址拿到了还不能直接用需要先做身份验证。支持两种方式1. 白名单把你服务器的公网出口IP加到后台的白名单里之后这个IP过来的请求自动放行代码里不用带任何认证参数。优点是代码干净缺点是你的出口IP得固定。云服务器一般没问题本地开发就不一定了。2. 账密在后台找到Authkey和Authpwd请求时按Authkey:Authpwd代理地址格式传入。不要求固定IP本地调试也能用。两种选一个就行。我在服务器上用白名单本地调试用账密。四、curl 测试写代码之前一定先用 curl 验一下否则出了问题不知道是代理的事还是代码的事。隧道代理测试# 账密方式 curl -x http://你的Authkey:你的Authpwd隧道地址 https://httpbin.org/ip ​ # 白名单方式 curl -x http://隧道地址 https://httpbin.org/ip短效代理测试需要先提取IP再测# 先提取 curl 你的短效代理API链接 # 返回类似180.XX.XX.1:端口 ​ # 再用提取到的IP测试 curl -x http://180.XX.XX.1:端口 https://httpbin.org/ip返回的 JSON 里 IP 和你本机不一样就说明代理通了。五、Python 代码集成curl 通了代码就好写了。隧道代理import requests ​ proxy http://你的Authkey:你的Authpwd隧道地址 proxies {http: proxy, https: proxy} ​ resp requests.get(https://httpbin.org/ip, proxiesproxies, timeout10) print(resp.json()) # 每次请求自动换IP不需要额外处理短效代理import requests ​ # 调API提取可用IP api_url 你的短效代理API链接 ip_list requests.get(api_url).text.strip().split(\n) ​ # 逐个使用 for ip in ip_list: proxies {http: fhttp://{ip}, https: fhttp://{ip}} try: resp requests.get(https://httpbin.org/ip, proxiesproxies, timeout5) print(f{ip} - {resp.json()}) except Exception as e: print(f{ip} 失败: {e})生产环境建议短效代理的IP有存活时间不要一次提取太多囤着。我的做法是每隔几分钟提取一批维护一个本地IP队列用完即弃。其他语言参考逻辑一样写法不同Node.js用http-proxy-agent或https-proxy-agentGo在http.Transport的Proxy字段设置Java用java.net.Proxy或HttpClient配置核心都是把代理地址告诉 HTTP 客户端。六、踩坑记录记几个我实际遇到的问题希望能帮别人少走弯路。坑1curl 能通代码里死活不行查了半天发现是代码里代理地址少写了http://前缀。requests 库不会自动补协议头少了就直接报错。另外如果 Authkey 或 Authpwd 里有、:这种特殊字符必须做 URL 编码from urllib.parse import quote ​ authkey quote(yourkey, safe) authpwd quote(your:pwd, safe) proxy fhttp://{authkey}:{authpwd}隧道地址坑2HTTP 正常HTTPS 直接断连一开始以为是代码的问题结果是套餐只支持 HTTP 转发。换了支持 HTTPS 的套餐就好了。这个问题没有报错信息直接 timeout很容易往错误方向排查。坑3白名单加了还是 403两个原因一是刚加的白名单有一两分钟的延迟等一下就好了二是我加错了IP——加的是ifconfig看到的内网IP实际出口IP不是这个。用这个命令查真实出口curl https://httpbin.org/ip坑4并发一高就大面积失败套餐有并发上限超了就被限流。我的解决方案是加了一个信号量控制并发数import asyncio import aiohttp ​ semaphore asyncio.Semaphore(10) # 根据套餐并发数设置 ​ async def fetch(url, proxy): async with semaphore: async with aiohttp.ClientSession() as session: async with session.get(url, proxyproxy, timeoutaiohttp.ClientTimeout(total10)) as resp: return await resp.json()坑5短效代理提取出来一堆不能用正常的。IP有存活窗口从提取到你用的这段时间里有些已经过期了。不要纠结可用率直接在代码里加异常处理 自动换下一个IP就行。总结整个流程跑通之后其实很简单就是拿地址→配授权→测试→写代码四步。关键是测试那一步别省先用 curl 确认代理本身没问题再去写业务代码能省很多排查时间。以上就是在极安代理环境下的完整接入过程有问题欢迎评论区交流。