一、背景
在訪問一個網站時,有時我們不想讓對方獲取到我們的真實IP,這種情況下,就可以使用代理IP進行訪問。
二、代理IP介紹
- 透明代理:可以直接“隱藏”你的IP地址,但還是可以查到你是誰。
- 匿名代理:比透明代理進步了一點:別人只能知道你用了代理,無法知道你是誰。
- 混淆代理:別人還是能知道你在用代理,但是會得到一個假的IP地址,僞裝的更逼真。
- 高匿代理:讓別人根本無法發現你是在用代理。一般推薦使用高匿代理。
三、使用代理IP實例
-
導入所需jar包,見http-jar.zip。
鏈接:https://pan.baidu.com/s/1omyA8t49kpngSpFBaMmwDA 提取碼:4be4 -
代碼:
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpProxy {
public static void main(String[] args) throws Exception {
// 創建HttpClient實例
CloseableHttpClient httpClient = HttpClients.createDefault();
//創建Httpget實例 ,http://2018.ip138.com/ic.asp爲該網址返回對應的ip
//以下爲要訪問的網址
HttpGet httpGet = new HttpGet("http://budwuv.v.vote8.cn");
//代理IP設置,代理 ip查詢地址:https://www.xicidaili.com/
HttpHost httoHost = new HttpHost("112.87.68.95",9999);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(10000)//設置連接超時時間,單位毫秒
.setSocketTimeout(10000)//設置讀取超時時間,單位毫秒
.setProxy(httoHost)//設置代理
.build();
httpGet.setConfig(requestConfig);
//設置Http報文頭信息
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");
CloseableHttpResponse response = httpClient.execute(httpGet); // 執行http get請求
if (response != null){
HttpEntity entity = response.getEntity(); //獲取返回實體
if (entity != null){
System.out.println("網頁內容爲:");
System.out.println(EntityUtils.toString(entity,"gbk"));
}
}
if (response != null){
response.close();
}
if (httpClient != null){
httpClient.close();
}
}
}
四、代理IP獲取方式
訪問 http://www.xicidaili.com/,可在該網站上 爬取最新的高匿代理IP,保存到本地;當一個IP被屏蔽或獲取連接超時時,取出下一個IP,當本地IP數不足時再重新爬取,以此類推。
五、驗證舉例
-
以網上在線投票系統爲例,在PC端訪問“投票吧”創建投票活動,設置爲“相同IP不允許不能在30分鐘內重複投票”,發佈投票活動http://budwuv.v.vote8.cn。
-
正常訪問投票網站,核心代碼如下:
HttpGet httpGet = new HttpGet("http://budwuv.v.vote8.cn");
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(10000)//設置連接超時時間,單位毫秒
.setSocketTimeout(10000)//設置讀取超時時間,單位毫秒
.build();
httpGet.setConfig(requestConfig);
//設置Http報文頭信息
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");
CloseableHttpResponse response = httpClient.execute(httpGet); // 執行http get請求
頁面截圖如下:
-
投票成功後再訪問該網站,發現提示相同IP在30分鐘之內不能重複投票,截圖如下:
-
用設置代理的方式重新訪問該網站,核心代碼如下:
HttpGet httpGet = new HttpGet("http://budwuv.v.vote8.cn");
//代理IP設置
HttpHost httoHost = new HttpHost("112.87.68.95",9999);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(10000)//設置連接超時時間,單位毫秒
.setSocketTimeout(10000)//設置讀取超時時間,單位毫秒
.setProxy(httoHost)//設置代理
.build();
httpGet.setConfig(requestConfig);
//設置Http報文頭信息
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");
CloseableHttpResponse response = httpClient.execute(httpGet); // 執行http get請求
該頁面可以正常投票,截圖如下: