代理配置示例(Python / Scrapy / curl / Postman)
提取到 ip:port 之后,不同工具的写法略有差别。下面都是可直接复制的最小示例;前提是这条代理已授权(把调用方出口 IP 加进白名单,或使用账号密码模式)。
Python requests(带失败换 IP)
import requests
API = ("http://api.xydaili.net:2022/tools/ip.ashx"
"?action=GetIP&protocol=1&qty=1&split=json&OrderNumber=你的订单号")
TARGET = "http://目标站点/page"
def fetch():
for _ in range(3): # 最多换 3 条 IP
r = requests.get(API, timeout=10).json()
if r.get("status") != 200 or not r.get("data"):
continue
item = r["data"][0]
proxy = "http://%s:%s" % (item["ip"], item["port"])
try:
resp = requests.get(TARGET, proxies={"http": proxy, "https": proxy}, timeout=15)
if resp.status_code == 200:
return resp.text
except requests.RequestException:
pass # 该条不可用,换下一条
raise RuntimeError("重试多次仍失败")
print(fetch()[:200])
要点:每失败一次就重新提取,不要复用已经失效的 IP;把 qty 调大一次取多条、在本地排队使用,可以显著减少接口调用。
Scrapy(下载中间件)
class ProxyMiddleware:
def __init__(self, api):
self.api = api
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings.get("PROXY_API"))
def process_request(self, request, spider):
item = requests.get(self.api, timeout=10).json()["data"][0]
request.meta["proxy"] = "http://%s:%s" % (item["ip"], item["port"])
把它加进 DOWNLOADER_MIDDLEWARES,并在 settings.py 里配置 PROXY_API。注意 RETRY_TIMES 和 DOWNLOAD_TIMEOUT 一起调,否则重试期间会一直用同一条失效 IP。
curl
curl -x "http://113.75.1.20:51008" -I "http://目标站点/" -m 15
# 账号密码模式(拼在代理地址里)
curl -x "http://用户名:密码@113.75.1.20:51008" "http://目标站点/" -m 15
Postman
打开 Settings → Proxy,把 Use custom proxy configuration 打开,Proxy Type 选 HTTP,Proxy Server 填提取到的 IP,Proxy Port 填对应端口,保存后直接发请求即可。调试时建议在 Postman 里用「Proxy」而不是在系统代理里改,避免影响其它软件。
Linux / 容器环境变量
export http_proxy="http://113.75.1.20:51008"
export https_proxy="http://113.75.1.20:51008"
# 让提取接口本身直连,不要走代理
export no_proxy="api.xydaili.net,localhost,127.0.0.1"
no_proxy 这一条很关键:很多人把提取接口也走了代理,代理一失效整条链路就断了——取 IP 的请求必须直连。
两种授权方式怎么选
| 方式 | 适用场景 | 配置要点 |
|---|---|---|
| IP 白名单授权 | 服务器出口 IP 固定、长期跑的采集任务 | 先把出口 IP 加进白名单(白名单接口),代理地址直接用 ip:port,无需账号密码 |
| 账号密码授权 | 多设备、出口 IP 会变、临时调试 | 用提取返回里的 userName/pwd,代理写成 http://用户名:密码@ip:port |
常见坑
- HTTPS 目标站:HTTP 代理访问 https 目标是靠
CONNECT隧道,requests / curl / Scrapy 都自动处理;如果自己手写 socket,需要先发 CONNECT。 - 别把提取接口走代理:见上面
no_proxy。 - 会话保持:带登录态的任务中途换 IP 会掉线,用
Cache=1&Cachetimems=...固定同一批出口。 - 频率:单 IP 每秒别超过 3 次请求,比堆线程更能降低封禁率。
- 代理没生效:先
curl -x单独验证这条代理,再回来看代码;浏览器里残留的代理配置也会干扰判断。
相关文档
- 快速开始 · 提取接口 · 状态码对照表
- 进阶阅读:代理IP的端口授权和账号授权到底该用哪个、更多采集实战文章