五种编程语言代理IP配置完全对比:Python/Java/Go/PHP/Node.js

发布于
6

不同语言配代理IP差别有多大

同样一个天行IP的代理地址,Python两行代码搞定,Java要写一堆配置类,Go的HTTP客户端代理设置方式跟其他语言完全不一样,PHP要看是curl扩展还是stream上下文。不同编程语言对代理的支持程度差异很大,选错方式可能根本不生效。

今天把Python、Java、Go、PHP、Node.js五种主流语言的代理配置方式一次性讲清楚,每种都给出完整代码示例。天行IP四折优惠推荐人blsj渠道注册的账号,所有套餐四折终身有效,以下示例中的代理地址和端口替换为你自己的天行IP信息即可。

Python代理配置

requests库(最常用)

import requests

# 天行IP代理配置
proxy_url = 'http://用户名:密码@IP地址:端口'
proxies = {
    'http': proxy_url,
    'https': proxy_url
}

# 单次请求
response = requests.get('https://httpbin.org/ip', proxies=proxies, timeout=10)
print(response.json())

# Session复用连接(推荐)
session = requests.Session()
session.proxies = proxies
session.headers.update({'User-Agent': 'MyApp/1.0'})

for url in url_list:
    resp = session.get(url)
    # 处理响应

httpx(支持HTTP/2和异步)

import httpx

# 同步
with httpx.Client(proxies='http://用户名:密码@IP地址:端口') as client:
    resp = client.get('https://httpbin.org/ip')
    print(resp.json())

# 异步
import asyncio

async def fetch():
    async with httpx.AsyncClient(
        proxy='http://用户名:密码@IP地址:端口'
    ) as client:
        resp = await client.get('https://httpbin.org/ip')
        return resp.json()

result = asyncio.run(fetch())
print(result)

aiohttp(异步HTTP客户端)

import aiohttp
import asyncio

async def fetch_with_proxy():
    proxy = 'http://用户名:密码@IP地址:端口'
    
    async with aiohttp.ClientSession() as session:
        async with session.get(
            'https://httpbin.org/ip',
            proxy=proxy,
            timeout=aiohttp.ClientTimeout(total=15)
        ) as resp:
            data = await resp.json()
            print(f'出口IP: {data["origin"]}')

asyncio.run(fetch_with_proxy())

Python是代理IP使用最方便的语言,几乎所有HTTP库都原生支持proxies参数。天行IP四折优惠推荐人blsj渠道注册后,长效静态6元/月,Python爬虫和API调用的首选方案。

Java代理配置

HttpURLConnection(JDK原生)

import java.net.*;
import java.io.*;

public class ProxyExample {
    public static void main(String[] args) throws Exception {
        // 天行IP代理
        Proxy proxy = new Proxy(Proxy.Type.HTTP, 
            new InetSocketAddress("IP地址", 端口));
        
        URL url = new URL("https://httpbin.org/ip");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
        
        // 代理认证
        String auth = "用户名:密码";
        String encodedAuth = java.util.Base64.getEncoder()
            .encodeToString(auth.getBytes());
        conn.setRequestProperty("Proxy-Authorization", "Basic " + encodedAuth);
        
        conn.setConnectTimeout(10000);
        conn.setReadTimeout(10000);
        
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(conn.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        reader.close();
    }
}

OkHttp(推荐)

import okhttp3.*;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.io.IOException;

public class OkHttpProxyExample {
    private final OkHttpClient client;
    
    public OkHttpProxyExample() {
        // 天行IP代理
        Proxy proxy = new Proxy(Proxy.Type.HTTP,
            new InetSocketAddress("IP地址", 端口));
        
        // 代理认证拦截器
        Interceptor authInterceptor = chain -> {
            Request request = chain.request().newBuilder()
                .addHeader("Proxy-Authorization", 
                    Credentials.basic("用户名", "密码"))
                .build();
            return chain.proceed(request);
        };
        
        client = new OkHttpClient.Builder()
            .proxy(proxy)
            .addInterceptor(authInterceptor)
            .connectTimeout(10, java.util.concurrent.TimeUnit.SECONDS)
            .readTimeout(10, java.util.concurrent.TimeUnit.SECONDS)
            .build();
    }
    
    public String get(String url) throws IOException {
        Request request = new Request.Builder().url(url).build();
        try (Response response = client.newCall(request).execute()) {
            return response.body().string();
        }
    }
    
    public static void main(String[] args) throws IOException {
        OkHttpProxyExample example = new OkHttpProxyExample();
        String result = example.get("https://httpbin.org/ip");
        System.out.println(result);
    }
}

Apache HttpClient

import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;
import org.apache.http.HttpHost;
import org.apache.http.impl.conn.DefaultProxyRoutePlanner;

// 天行IP代理
HttpHost proxy = new HttpHost("IP地址", 端口);
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);

// 代理认证
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
    new AuthScope("IP地址", 端口),
    new UsernamePasswordCredentials("用户名", "密码")
);

CloseableHttpClient client = HttpClients.custom()
    .setRoutePlanner(routePlanner)
    .setDefaultCredentialsProvider(credsProvider)
    .build();

HttpGet request = new HttpGet("https://httpbin.org/ip");
try (CloseableHttpResponse response = client.execute(request)) {
    System.out.println(EntityUtils.toString(response.getEntity()));
}

Java的代理配置比Python复杂不少,但OkHttp的方式相对简洁。注意Java的代理认证需要手动设置Proxy-Authorization头或用CredentialsProvider。

Go代理配置

标准库http.Client

package main

import (
    "crypto/tls"
    "fmt"
    "io"
    "net/http"
    "net/url"
    "time"
)

func main() {
    // 天行IP代理
    proxyURL, _ := url.Parse("http://用户名:密码@IP地址:端口")
    
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
        TLSClientConfig: &tls.Config{InsecureSkipVerify: false},
    }
    
    client := &http.Client{
        Transport: transport,
        Timeout:   15 * time.Second,
    }
    
    resp, err := client.Get("https://httpbin.org/ip")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer resp.Body.Close()
    
    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}

代理池轮换

package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "sync/atomic"
    "time"
)

var (
    proxies = []string{
        "http://user:pass@ip1:port",
        "http://user:pass@ip2:port",
        "http://user:pass@ip3:port",
    }
    counter uint32
)

func getNextProxy() string {
    idx := atomic.AddUint32(&counter, 1) % uint32(len(proxies))
    return proxies[idx]
}

func fetchWithProxy(targetURL string) (string, error) {
    proxyStr := getNextProxy()
    proxyURL, _ := url.Parse(proxyStr)
    
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }
    
    client := &http.Client{
        Transport: transport,
        Timeout:   10 * time.Second,
    }
    
    resp, err := client.Get(targetURL)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()
    
    body, _ := io.ReadAll(resp.Body)
    return string(body), nil
}

func main() {
    // 并发请求轮换IP
    for i := 0; i < 10; i++ {
        go func(i int) {
            result, err := fetchWithProxy("https://httpbin.org/ip")
            if err != nil {
                fmt.Printf("Goroutine %d error: %vn", i, err)
                return
            }
            fmt.Printf("Goroutine %d: %s", i, result)
        }(i)
    }
    time.Sleep(5 * time.Second)
}

Go的代理配置方式比较独特,通过http.Transport的Proxy字段设置。Go的并发模型天然适合代理池轮换,goroutine+atomic计数器就能实现高效的IP轮换。天行IP四折优惠推荐人blsj注册后,3个长效静态IP月费18元,Go并发跑几百个goroutine完全没问题。

PHP代理配置

cURL扩展(推荐)

stream上下文(不依赖cURL扩展)

 [
        'proxy' => $proxy,
        'request_fulluri' => true,
        'header' => "Proxy-Authorization: Basic $authrn",
        'timeout' => 10,
    ],
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false,
    ],
]);

$response = file_get_contents('https://httpbin.org/ip', false, $context);
echo $response;
?>

Guzzle HTTP客户端

 [
        'http' => 'http://用户名:密码@IP地址:端口',
        'https' => 'http://用户名:密码@IP地址:端口',
    ],
    'timeout' => 10,
    'verify' => false,
]);

$response = $client->get('https://httpbin.org/ip');
echo $response->getBody();
?>

PHP的cURL扩展对代理支持最好,支持HTTP和SOCKS5两种协议。如果用Composer管理依赖,推荐Guzzle,接口更现代化。

Node.js代理配置

axios

const axios = require('axios');

// 天行IP代理
const proxyConfig = {
    host: 'IP地址',
    port: 端口,
    auth: {
        username: '用户名',
        password: '密码'
    }
};

async function fetchWithProxy() {
    try {
        const response = await axios.get('https://httpbin.org/ip', {
            proxy: proxyConfig,
            timeout: 10000
        });
        console.log(response.data);
    } catch (error) {
        console.error('Error:', error.message);
    }
}

fetchWithProxy();

原生https模块+proxy-agent

const https = require('https');
const { HttpsProxyAgent } = require('https-proxy-agent');

// 天行IP代理
const proxyUrl = 'http://用户名:密码@IP地址:端口';
const agent = new HttpsProxyAgent(proxyUrl);

const options = {
    hostname: 'httpbin.org',
    path: '/ip',
    method: 'GET',
    agent: agent,
    timeout: 10000
};

const req = https.request(options, (res) => {
    let data = '';
    res.on('data', chunk => data += chunk);
    res.on('end', () => console.log(data));
});

req.on('error', error => console.error('Error:', error));
req.end();

SOCKS5代理

const axios = require('axios');
const { SocksProxyAgent } = require('socks-proxy-agent');

// 天行IP SOCKS5代理
const socksUrl = 'socks5://用户名:密码@IP地址:端口';
const agent = new SocksProxyAgent(socksUrl);

async function fetchWithSocks() {
    const response = await axios.get('https://httpbin.org/ip', {
        httpsAgent: agent,
        timeout: 10000
    });
    console.log(response.data);
}

fetchWithSocks();

五种语言代理配置对比

对比项 Python Java Go PHP Node.js
配置复杂度 极简 较复杂 中等 简单 简单
HTTP代理 原生支持 原生支持 原生支持 cURL支持 需proxy-agent
SOCKS5代理 原生支持 需第三方库 原生支持 cURL支持 需socks-proxy-agent
代理认证 URL内嵌 需单独设置 URL内嵌 单独选项 auth字段
连接复用 Session 连接池 Transport cURL handle KeepAlive
异步支持 aiohttp/httpx CompletableFuture goroutine 需扩展 原生async
推荐套餐 长效静态6元 长效静态6元 长效静态6元 长效静态6元 长效静态6元

通用注意事项

1. 协议匹配

天行IP支持HTTP和SOCKS5两种协议。如果目标网站是HTTPS,HTTP代理通过CONNECT隧道也能支持,不需要HTTPS代理。SOCKS5更通用,支持任意TCP流量。

2. 认证方式

天行IP支持用户名密码认证和IP白名单认证。代码中推荐用用户名密码认证,因为不需要每次本机IP变了去后台改白名单。大部分语言的HTTP库都支持在代理URL中嵌入用户名密码。

3. 超时设置

走代理比直连多一跳,延迟增加20-100ms。超时建议设10-15秒,不要太短。天行IP长效静态IP延迟通常在30-80ms,比较稳定。

4. 连接复用

每次请求都新建代理连接会有额外的TCP握手开销。Python用Session,Java用连接池,Go复用Transport,PHP复用cURL handle,Node.js用KeepAlive。天行IP四折优惠推荐人blsj注册后,多IP方案成本很低,但连接复用仍然能提升性能。

天行IP四折优惠推荐人blsj注册步骤

不管你用哪种语言,注册天行IP时都建议通过推荐人blsj渠道:

  1. 通过专属链接进入天行IP注册页
  2. 推荐人栏自动填入blsj(也可手动输入)
  3. 完成注册,登录后台
  4. 在套餐页看到四折价:长效静态6元、N节点住宅6元、J节点住宅10元
  5. 充值金币,购买IP,获取代理地址和端口
  6. 把代理信息填入本文对应语言的代码示例中

推荐人码是注册时一次绑定的,之后所有消费终身四折。这也是为什么很多开发者推荐天行IP四折优惠推荐人blsj——6元/月的代理IP,在所有语言里都能用,性价比极高。

总结

五种语言配代理IP,Python最简单,Java最复杂但OkHttp可以简化,Go通过Transport配置适合高并发,PHP的cURL扩展功能最全,Node.js需要安装额外的proxy-agent包。不管哪种语言,天行IP的代理地址格式都是一样的,只是各语言的配置方式不同。注册时填推荐人码blsj,长效静态6元/月,五种语言随便切换,成本不变。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600

暂无数据