隧道代理接入手册
通过固定网关连接爬虫混合池或纯住宅池。默认全球随机,可按流量或并发线程使用,并在纯住宅池中配置 SESSION。
最小可运行请求
示例已固定使用 proxy.123proxy.cn:36923。只需替换代理用户名和密码;出口 IP 由所选代理池自动分配。
curl --fail-with-body --silent --show-error \
--proxy "http://proxy.123proxy.cn:36923" \
--proxy-user "YOUR_PROXY_USER:YOUR_PROXY_PASSWORD" \
--connect-timeout 15 \
--max-time 30 \
"https://api.ipify.org?format=json"import os
import requests
proxy_url = (
f"http://{os.environ['PROXY_USER']}:"
f"{os.environ['PROXY_PASS']}@"
"proxy.123proxy.cn:36923"
)
response = requests.get(
"https://api.ipify.org?format=json",
proxies={"http": proxy_url, "https": proxy_url},
timeout=(15, 30),
)
response.raise_for_status()
print(response.json())// npm install axios
const axios = require("axios");
const response = await axios.get(
"https://api.ipify.org?format=json",
{
proxy: {
protocol: "http",
host: "proxy.123proxy.cn",
port: 36923,
auth: {
username: process.env.PROXY_USER,
password: process.env.PROXY_PASS,
},
},
timeout: 30000,
},
);
console.log(response.data);package main
import (
"fmt"
"io"
"net/http"
"net/url"
"os"
"time"
)
func main() {
proxyURL := &url.URL{
Scheme: "http",
Host: "proxy.123proxy.cn:36923",
User: url.UserPassword(os.Getenv("PROXY_USER"), os.Getenv("PROXY_PASS")),
}
client := &http.Client{
Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)},
Timeout: 30 * time.Second,
}
response, err := client.Get("https://api.ipify.org?format=json")
if err != nil { panic(err) }
defer response.Body.Close()
if response.StatusCode >= 400 { panic(response.Status) }
body, err := io.ReadAll(response.Body)
if err != nil { panic(err) }
fmt.Println(string(body))
}import java.net.Authenticator;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.ProxySelector;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class ProxyCheck {
public static void main(String[] args) throws Exception {
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
String host = "proxy.123proxy.cn";
int port = 36923;
String user = System.getenv("PROXY_USER");
char[] password = System.getenv("PROXY_PASS").toCharArray();
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress(host, port)))
.authenticator(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
})
.connectTimeout(Duration.ofSeconds(15))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.ipify.org?format=json"))
.timeout(Duration.ofSeconds(30))
.GET()
.build();
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
if (response.statusCode() >= 400) throw new RuntimeException(response.body());
System.out.println(response.body());
}
}<?php
$host = "proxy.123proxy.cn";
$port = 36923;
$user = getenv("PROXY_USER");
$password = getenv("PROXY_PASS");
$curl = curl_init("https://api.ipify.org?format=json");
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_PROXY => $host,
CURLOPT_PROXYPORT => (int) $port,
CURLOPT_PROXYUSERPWD => $user . ":" . $password,
CURLOPT_CONNECTTIMEOUT => 15,
CURLOPT_TIMEOUT => 30,
]);
$body = curl_exec($curl);
if ($body === false) {
throw new RuntimeException(curl_error($curl));
}
$status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
curl_close($curl);
if ($status >= 400) throw new RuntimeException($body);
echo $body . PHP_EOL;python -m pip install "requests[socks]"
export PROXY_URL="socks5h://YOUR_PROXY_USER:YOUR_PROXY_PASSWORD@proxy.123proxy.cn:36923"
python - <<'PY'
import os
import requests
proxy = os.environ["PROXY_URL"]
response = requests.get(
"https://api.ipify.org?format=json",
proxies={"http": proxy, "https": proxy},
timeout=(15, 30),
)
response.raise_for_status()
print(response.json())
PY
程序连接固定网关即可。代理健康检查、出口选择和轮转由 123Proxy 网络完成。
先选择代理池
混入少量数据中心 IP,公开网页采集通常比纯住宅池更快。
- 适合列表页、详情页和高频公开请求
- 不支持 SESSION
- 默认全球随机
只包含住宅出口,适合需要住宅网络属性或多步骤会话的任务。
- 支持按请求轮转
- 账密认证支持 SESSION
- 通常比混合池稍慢
流量与并发线程
一个页面会同时加载 HTML、图片、CSS、JavaScript、字体和接口请求,通常可能占用 10-20 个并发线程。浏览器自动化应按真实页面测量。
地区在提取代理时选择
隧道代理默认从全球代理池随机选择出口。它不提供国家级任意定位,只支持以下粗粒度地区预设。
请选择隧道住宅代理。它支持在提取时指定国家或地区,并将国家码编码到认证用户名末尾。
账密与套餐 IP 白名单
选择一个代理用户。程序发送代理用户名和密码,适合开发机、动态服务器和多 worker。
HOST:PORT:USER:PASSWORD每行填写一个采集服务器公网 IPv4,保存到当前套餐。程序只需使用 HOST:PORT。
HOST:PORT白名单以套餐为作用域,不是独立账户页面;纯住宅池的 SESSION 只支持账密认证,白名单模式不支持 SESSION。
纯住宅池的 SESSION
纯住宅池默认可按请求轮转。需要分页、短流程或多步骤请求尽量保持同一住宅出口时,在账密认证用户名中加入 SESSION。
proxy-user-sess_a8F3kP9xQ2mL_15
必须是 12 位英文字母或数字。复用相同 ID 才会命中同一粘性路由。
支持 1-120 分钟。到期或出口不可用时会重新分配。
使用新的 SESSION ID,或者回到每次请求轮转模式。
代理输出格式
选择与你的采集工具一致的格式。控制台 API 链接使用 txt_type 决定文本输出顺序。
txt_type=1HOST:PORT:USER:PASSWORDtxt_type=2HOST:PORT@USER:PASSWORDtxt_type=3USER:PASSWORD:HOST:PORTtxt_type=4USER:PASSWORD@HOST:PORT提取链接包含套餐标识和路由参数。不要将完整链接或代理密码提交到公开代码仓库。
生产使用建议
常见问题
为什么纯住宅池没有保持同一出口?
确认使用账密认证、SESSION ID 为 12 位字母或数字、分钟数在 1-120 之间,并且连续请求使用完全相同的认证用户名。
为什么选择地区后仍出现其他国家?
隧道代理只提供粗粒度地区,不是国家精确定位。需要指定国家时使用隧道住宅代理,并预留路由配置同步时间。
并发线程套餐是否限制传输流量?
不按累计 GB 计费,但限制同时在途请求数。目标响应、连接复用和浏览器子资源都会影响实际并发占用。
HOSTNAME 和 IP 接入怎么选?
优先使用 HOSTNAME,便于网关维护和故障切换。只有运行环境存在 DNS 限制或控制台明确建议时再使用固定 IP。