代理IP接入程序的完整流程(Python 实战,附排坑记录)
2026/6/26 4:01:12 网站建设 项目流程

最近项目里需要用到代理IP,从选型到跑通代码踩了一些坑,把整个过程记录一下,希望对同样在做这块的朋友有帮助。

我用的是极安代理,它有短效代理和隧道代理两种产品。下面的操作和代码都基于这个环境,但原理部分是通用的,换别的服务商逻辑一样。

一、先搞清楚短效代理和隧道代理的区别

这两种代理的工作方式完全不同,选错了后面的接入方式也不一样,所以放在最前面说。

短效代理(有的平台叫提取式代理、API代理):你调一个接口,它返回一批IP给你,每个IP有存活时间,过期作废,你得重新提取。相当于你自己管一个IP池。

隧道代理(有的平台叫旋转代理):给你一个固定的代理地址,你所有请求都往这个地址发,后端自动帮你换IP。你不用关心IP的事。

简单对比:

短效代理隧道代理
你拿到什么一条API链接,调用返回IP列表一个固定的host:port地址
IP怎么换自己管,过期了重新提取自动换,你不用管
代码量多一些,要写IP池逻辑少,配一次地址就行
适合什么场景需要大量不同IP要稳定通道、怕麻烦

我的场景需要大量不同IP,所以两种都试了。

二、获取代理地址

这一步很简单。

短效代理:到极安代理的提取工具页面,选好地区、协议、数量,页面生成一条API链接,复制就行。也可以看接口文档自己拼参数,灵活度更高。

隧道代理:购买后进后台,产品列表里直接有隧道地址,复制走。

三、配置授权验证

地址拿到了还不能直接用,需要先做身份验证。支持两种方式:

1. 白名单

把你服务器的公网出口IP加到后台的白名单里,之后这个IP过来的请求自动放行,代码里不用带任何认证参数。

优点是代码干净,缺点是你的出口IP得固定。云服务器一般没问题,本地开发就不一定了。

2. 账密

在后台找到AuthkeyAuthpwd,请求时按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", proxies=proxies, timeout=10) 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": f"http://{ip}", "https": f"http://{ip}"} try: resp = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=5) print(f"{ip} -> {resp.json()}") except Exception as e: print(f"{ip} 失败: {e}")

生产环境建议:短效代理的IP有存活时间,不要一次提取太多囤着。我的做法是每隔几分钟提取一批,维护一个本地IP队列,用完即弃。

其他语言参考

逻辑一样,写法不同:

  • Node.js:用http-proxy-agenthttps-proxy-agent

  • Go:在http.TransportProxy字段设置

  • Java:用java.net.ProxyHttpClient配置

核心都是把代理地址告诉 HTTP 客户端。

六、踩坑记录

记几个我实际遇到的问题,希望能帮别人少走弯路。

坑1:curl 能通,代码里死活不行

查了半天发现是代码里代理地址少写了http://前缀。requests 库不会自动补协议头,少了就直接报错。另外如果 Authkey 或 Authpwd 里有@:这种特殊字符,必须做 URL 编码:

from urllib.parse import quote ​ authkey = quote("your@key", safe="") authpwd = quote("your:pwd", safe="") proxy = f"http://{authkey}:{authpwd}@隧道地址"

坑2:HTTP 正常,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, proxy=proxy, timeout=aiohttp.ClientTimeout(total=10)) as resp: return await resp.json()

坑5:短效代理提取出来一堆不能用

正常的。IP有存活窗口,从提取到你用的这段时间里,有些已经过期了。不要纠结可用率,直接在代码里加异常处理 + 自动换下一个IP就行。

总结

整个流程跑通之后其实很简单,就是拿地址→配授权→测试→写代码,四步。关键是测试那一步别省,先用 curl 确认代理本身没问题,再去写业务代码,能省很多排查时间。

以上就是在极安代理环境下的完整接入过程,有问题欢迎评论区交流。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询