做数据采集、做市场调研、跑多节点测试……只要你稍微碰过一点网络请求相关的工作,大概率会碰到同一个问题:单个IP用着用着就被限流了,或者目标站点直接把你标记成异常访问。这时候你需要的不是"换个IP试试"这种临时方案,而是一套动态代理IP的完整配置流程。
但说实话,很多人卡住的地方不是"不知道要配代理",而是系统端和代码端到底怎么配合、代理参数填哪里、API怎么调、IP过期了怎么自动续——这些细节散落在各种文档里,东一块西一块,看得人头晕。这篇文章我就把这条链路从头到尾捋一遍,从操作系统层面的设置,到代码里那一两行配置,再到怎么通过API实时拉取神龙HTTP的代理资源,全部讲清楚。你跟着做,基本就能跑通。
动手之前,先确认你的环境能不能走代理
别急着改配置,先花两分钟确认几件事,能省后面大量的排查时间。
第一,你的目标站点允不允许代理访问。有些站点在请求头里会校验来源,如果你用的代理IP质量不行、或者协议没配对(比如目标只认HTTPS你走了HTTP),请求直接403。神龙HTTP这边支持HTTP/HTTPS/SOCKS5三种协议,你根据目标站点的要求选就行,一般HTTPS场景选HTTPS协议最稳。
第二,你的代码框架支不支持代理参数。Python的requests、Java的HttpClient、Node.js的axios,主流库都支持,但写法不一样。后面代码部分我会分别给出来。
第三,你的网络出口有没有做白名单限制。公司内网、云服务器如果配了安全组或者防火墙规则,代理流量可能被拦掉。这种情况先找运维把对应端口放通,再往下走。
这三点确认没问题,就可以开始配了。
系统端配置:让整台机器默认走代理
有些场景下你希望所有出站流量都经过代理,比如你跑的是一个老项目,代码里没法逐处改代理参数,或者你用的是某些不支持代码级代理的工具。这时候就在操作系统层面做全局设置。
Windows:打开"设置 → 网络和Internet → 代理",把"使用代理服务器"打开,填上代理地址和端口。如果你用的是神龙HTTP的短效动态IP,注意IP是3到30分钟轮换的,系统级配置意味着你每次IP到期都得手动改一次,所以系统端配置更适合固定IP或者长效静态IP的场景。如果你用的是短效动态IP,建议走代码端配置,配合API自动拉取,后面会讲。
Linux(Ubuntu/CentOS):一般通过环境变量搞定,在终端里执行:
export http_proxy="http://你的代理IP:端口"
export https_proxy="http://你的代理IP:端口"
export no_proxy="localhost,127.0.0.1,内网网段"
写进 ~/.bashrc 或 ~/.profile 里可以持久化。但同样的问题——短效IP到期后环境变量不会自动更新,所以这里更适合固定IP或长效IP。
macOS:系统偏好设置 → 网络 → 选当前连接 → 代理 → 勾选"Web代理(HTTP)"和"安全Web代理(HTTPS)",填地址端口。逻辑和Windows一样。
这里说一个容易忽略的点:系统端代理和代码端代理是可以共存的,但代码端如果显式指定了代理参数,会覆盖系统设置。所以如果你代码里已经配了代理,系统端就不用再设了,避免两层代理叠加导致延迟翻倍。
代码端配置:只让特定请求走代理
这是最常用、也最灵活的方式。你只控制哪些请求走代理、走哪个IP,其他请求走直连,互不干扰。下面按语言给示例,都是最精简的写法,你直接往项目里搬就行。
Python(requests库):
import requests
单个代理
proxies = {
"http": "http://120.234.xx.xx:8080",
"https": "http://120.234.xx.xx:8080"
}
resp = requests.get("https://example.com/data", proxies=proxies, timeout=10)
print(resp.status_code, resp.text[:200])
Python(aiohttp,异步场景):
import aiohttp
async def fetch(url):
proxy = "http://120.234.xx.xx:8080"
async with aiohttp.ClientSession() as session:
async with session.get(url, proxy=proxy, timeout=aiohttp.ClientTimeout(total=10)) as resp:
return await resp.text()
Java(HttpClient):
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.http.;
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("120.234.xx.xx", 8080));
HttpClient client = HttpClient.newBuilder()
.proxy(proxy)
.connectTimeout(java.time.Duration.ofSeconds(10))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(java.net.URI.create("https://example.com/data"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
Node.js(axios):
const axios = require('axios');
const client = axios.create({
proxy: {
host: '120.234.xx.xx',
port: 8080,
protocol: 'http'
},
timeout: 10000
});
client.get('https://example.com/data')
.then(res => console.log(res.status, res.data))
.catch(err => console.error(err.message));
注意一个细节:如果你的代理需要认证(用户名密码),格式是 http://用户名:密码@IP:端口。神龙HTTP的代理资源一般不需要额外认证,直接填IP和端口就行,但如果你走的是企业定制池,具体认证方式以对接文档为准。
对接神龙HTTP的API:怎么实时拿到可用的IP
前面代码里的IP是写死的,实际生产环境你不可能手动去填。动态代理IP的核心价值就在于IP是动态轮换的,你得通过API实时拉取。神龙HTTP的API设计得比较直接,核心就一个GET请求:
GET https://api.shenlongip.com/getip?num=1&type=1&format=json
参数说明:
| 参数 | 说明 | 示例值 |
|---|---|---|
| num | 本次获取的IP数量 | 1、5、10 |
| type | IP类型(1=短效动态,2=长效静态,3=固定) | 1 |
| format | 返回格式 | json / txt |
| city | 指定城市(可选,支持300+城市级定位) | 杭州 |
| province | 指定省份(可选) | 浙江 |
返回示例(json格式):
{
"code": 200,
"data": [
{
"ip": "120.234.xx.xx",
"port": 8080,
"expire": 300
}
],
"msg": "success"
}
拿到IP后直接拼进前面代码的proxy参数里就行。这里有个关键逻辑:短效动态IP的存活时间有3/5/10/15/30分钟几档(可定制),你的代码里最好做一个简单的IP池管理——比如维护一个列表,每次请求前检查当前IP是否快过期(比如剩余时间小于60秒),如果快过期就调API拉新的。不用搞得太复杂,一个定时器或者请求前的判断就够了。
Python里一个简单的封装:
import requests
import time
class ProxyPool:
def __init__(self, api_url, ip_type=1, city=None):
self.api_url = api_url
self.ip_type = ip_type
self.city = city
self.current_ip = None
self.current_port = None
self.expire_at = 0
def _fetch(self):
params = {"num": 1, "type": self.ip_type, "format": "json"}
if self.city:
params["city"] = self.city
resp = requests.get(self.api_url, params=params, timeout=5)
data = resp.json()["data"][0]
self.current_ip = data["ip"]
self.current_port = data["port"]
self.expire_at = time.time() + data["expire"] - 30 提前30秒刷新
def get_proxy(self):
if self.current_ip is None or time.time() > self.expire_at:
self._fetch()
return f"http://{self.current_ip}:{self.current_port}"
def request(self, url, kwargs):
proxies = {"http": self.get_proxy(), "https": self.get_proxy()}
return requests.get(url, proxies=proxies, timeout=10, kwargs)
使用
pool = ProxyPool("https://api.shenlongip.com/getip", ip_type=1, city="杭州")
resp = pool.request("https://example.com/data")
print(resp.status_code)
这段代码不花哨,但够用了。核心思路就是用之前检查、过期就拉新的,不需要复杂的队列或者线程池,除非你的并发量特别大。
选哪种IP类型:短效、长效还是固定
很多人一上来就问"我买哪种",其实取决于你的使用场景。我直接给个对照,你对号入座:
| 维度 | 短效动态IP | 长效静态IP | 固定IP |
|---|---|---|---|
| 存活时间 | 3~30分钟(可定制) | 1~24小时(可定制) | 长期有效 |
| IP变化频率 | 很快,每日3000万+资源更新去重 | 每日去重量10万+ | 不变 |
| 适合场景 | 高频数据采集、需要频繁换IP的场景 | 中频任务、需要IP相对稳定但不想绑死 | API对接、需要固定出口的场景 |
| 计费方式 | 包量/包时 | 包量/包时 | 按个数+包时 |
| IP纯度 | 99.8% | 99.8% | 99.83% |
说白了:你请求频率高、目标站点风控严,选短效动态;你跑一个定时任务,几小时跑一次,选长效静态就够了;你就是需要一个稳定的出口IP做接口对接或者数据回传,选固定IP。神龙HTTP这三类都有,而且都是国内三大运营商正规授权的资源,不是那种来路不明的IP池,这点在合规性上很重要。
另外提一句,神龙HTTP的IP资源覆盖300+城市级定位节点,如果你做市场调研或者需要按地区维度采集数据,可以指定省份或城市,这个在API里加个参数就行,不用单独开线路。
踩坑记录:几个容易忽略的细节
1. 代理IP和直连IP混用导致的Cookie问题。如果你的业务涉及登录态,同一个Session里一会儿走代理A一会儿走代理B,目标站点可能认为你换了设备,直接踢掉登录。解决办法:同一个业务会话内固定用一个IP,等这个IP到期了再整体换,别在请求中间随机切。
2. 超时设置别太短。代理多了一跳,网络延迟会比直连高几十到一两百毫秒。你timeout设成3秒,正常请求可能刚好卡边界,一波动就超时。建议至少给10秒,高并发场景可以适当放宽到15秒。
3. 并发别拉太满。神龙HTTP支持高并发提取,但你的目标站点不一定扛得住。如果你同时开200个线程全打同一个URL,就算IP够多,目标站也可能直接封你整个IP段。建议控制并发数,加上随机延迟(比如每个请求之间sleep 0.5~2秒),模拟正常访问节奏。
4. 日志里把代理IP记下来。出问题时你总得知道"这个请求到底走的哪个IP"。在日志里把每次请求使用的代理IP、端口、时间戳都打出来,排查效率能提升好几倍。神龙HTTP的个人中心也有可视化数据统计,能看到IP使用趋势和异常,配合本地日志一起看,基本能定位大部分问题。
5. HTTPS代理的协议别搞混。如果你的代理协议是HTTPS,但代码里proxy参数写的是 http://,部分库会报SSL错误。确保协议前缀和实际代理协议一致。神龙HTTP三种协议都支持,你选哪个就写哪个。
常见问题
Q1:我用了神龙HTTP的短效动态IP,但请求还是被目标站点拒绝了,怎么排查?
先确认三件事:一是你拿到的IP是不是真的过期了(调API返回的expire字段,看看当前时间是否已经过了);二是目标站点是不是对IP段做了黑名单(换一个城市节点的IP试试,如果换城市就通了,说明是IP段问题);三是你的请求头是不是太"裸"了,有些站点会校验User-Agent、Accept等字段,代理IP本身没问题但请求特征太明显也会被拦。建议把请求头伪装成正常浏览器,加上Referer和Accept-Language。
Q2:我的项目是Java写的,用HttpClient配了代理,但走的是内网地址时代理也生效了,怎么排除?
Java的HttpClient不像requests有no_proxy参数那么直观。你可以在代码里判断一下目标URL,如果是内网地址(10.x、172.16~31.x、192.168.x)就直接走直连,不设置proxy。或者用两个HttpClient实例,一个带代理一个不带,根据目标地址选择。别图省事全局设一个proxy,内网服务全走代理既慢又可能不通。
Q3:短效动态IP的存活时间最短3分钟,我的单次任务要跑5分钟,IP中途过期了怎么办?
两个思路:一是买的时候选5分钟或10分钟的档位,神龙HTTP支持3/5/10/15/30分钟可选,也可以定制,你根据任务时长选一个刚好覆盖的就行;二是如果你的任务确实需要更长时间,考虑用长效静态IP(1~24小时),IP在一个任务周期内不会变,稳定性更好。别硬用3分钟的IP跑5分钟的任务,中间断掉重新拉IP,业务逻辑会很麻烦。
Q4:我同时跑多个采集任务,每个任务用不同的城市节点,IP会互相冲突吗?
不会。神龙HTTP的IP池是3000万+资源每日更新去重的,不同城市节点分配的是不同的IP段,你指定"杭州"和"成都"拿到的IP本身就是不同运营商、不同网段的资源,不存在冲突。但要注意同一个任务内不要频繁换城市,比如一个采集流程里前3个请求走杭州、后3个走成都,目标站点看到你的IP地理位置跳变,可能会触发风控。一个任务锁定一个城市,任务结束后再换。
最后说一句,代理IP配置这件事,80%的问题出在细节上——协议写错了、超时设太短、IP过期没刷新、认证信息漏了。把上面这些点过一遍,你的动态代理IP链路基本就通了。神龙HTTP这边API文档写得比较清楚,技术团队也是7×24在线的,对接过程中遇到具体问题直接问就行,不用自己对着文档猜。把基础链路跑通之后,后面调优就是水到渠成的事了。


