簡介
隧道代理(Tunnel Proxy
)是一種特殊的代理服務,它的工作方式是在客戶端與遠端伺服器之間建立一條“隧道”。這種技術常被用來繞過網路限制或提高網路安全性。
主要功能
- IP地址變換:隧道代理能夠改變客戶端的IP地址,使得客戶端訪問的目標伺服器看到的是代理伺服器的IP地址,而不是客戶端的真實IP地址。
- 資料加密傳輸:某些隧道代理服務會提供加密功能,確保資料在客戶端與遠端伺服器之間的安全傳輸。
- 動態IP池管理:隧道代理通常由雲服務提供支援,具有動態分配IP地址的能力,這意味著可以頻繁更換IP以避免被目標伺服器封鎖。
- 簡化開發流程:對於開發者來說,使用隧道代理可以減少管理IP池的複雜度,從而降低開發成本。
使用
註冊隧道代理服務
https://www.kuaidaili.com/?ref=nes3yyyaelhd
網際網路上有許多代理服務商,這個以其中一個舉例
選擇對應方式
按個人所需購買不同方式,若僅為短時非高頻使用,建議購買按量付費模式。
程式碼實現
這裡以
java
語言為例
jsoup
import java.io.IOException;
import java.net.Authenticator;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class TestProxyJsoup {
// 使用者名稱密碼, 若已新增白名單則不需要新增
final static String ProxyUser = "t****";
final static String ProxyPass = "*****";
// 隧道域名、埠號
final static String ProxyHost = "***.***.com";
final static Integer ProxyPort = '****';
public static String getUrlProxyContent(String url) {
Authenticator.setDefault(new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(ProxyUser, ProxyPass.toCharArray());
}
});
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ProxyHost, ProxyPort));
try {
// 此處自己處理異常、其他引數等
Document doc = Jsoup.connect(url).followRedirects(false).timeout(3000).proxy(proxy).get();
if (doc != null) {
System.out.println(doc.body().html());
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws Exception {
// 目標網站
String targetUrl = "https://***.***.com/****";
// JDK 8u111版本後,目標頁面為HTTPS協議,啟用proxy使用者密碼鑑權
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
getUrlProxyContent(targetUrl);
}
}
hutool
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpRequest;
// 代理驗證資訊
class ProxyAuthenticator extends Authenticator {
private String user, password;
public ProxyAuthenticator(String user, String password) {
this.user = user;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password.toCharArray());
}
}
public class TestProxyHutool {
// 使用者名稱密碼, 若已新增白名單則不需要新增
final static String ProxyUser = "t****";
final static String ProxyPass = "*****";
// 隧道域名、埠號
final static String ProxyHost = "***.***.com";
final static Integer ProxyPort = '*****';
public static void main(String[] args) {
// 目標網站
String url = "https://***.***.com/***";
// JDK 8u111版本後,目標頁面為HTTPS協議,啟用proxy使用者密碼鑑權
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
// 設定請求驗證資訊
Authenticator.setDefault(new ProxyAuthenticator(ProxyUser, ProxyPass));
// 傳送請求
HttpResponse result = HttpRequest.get(url)
.setHttpProxy(ProxyHost, ProxyPort)
.timeout(20000)//設定超時,毫秒
.execute();
System.out.println(result.body());
}
}
結束