java HttpClient使用代理IP

一、背景

在访问一个网站时,有时我们不想让对方获取到我们的真实IP,这种情况下,就可以使用代理IP进行访问。

二、代理IP介绍

  1. 透明代理:可以直接“隐藏”你的IP地址,但还是可以查到你是谁。
  2. 匿名代理:比透明代理进步了一点:别人只能知道你用了代理,无法知道你是谁。
  3. 混淆代理:别人还是能知道你在用代理,但是会得到一个假的IP地址,伪装的更逼真。
  4. 高匿代理:让别人根本无法发现你是在用代理。一般推荐使用高匿代理。

三、使用代理IP实例

  1. 导入所需jar包,见http-jar.zip。
    链接:https://pan.baidu.com/s/1omyA8t49kpngSpFBaMmwDA     提取码:4be4

  2. 代码:

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数不足时再重新爬取,以此类推。

五、验证举例

  1. 以网上在线投票系统为例,在PC端访问“投票吧”创建投票活动,设置为“相同IP不允许不能在30分钟内重复投票”,发布投票活动http://budwuv.v.vote8.cn。

  2. 正常访问投票网站,核心代码如下:

		    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请求

页面截图如下:
java HttpClient使用代理IP_第1张图片

  1. 投票成功后再访问该网站,发现提示相同IP在30分钟之内不能重复投票,截图如下: java HttpClient使用代理IP_第2张图片

  2. 用设置代理的方式重新访问该网站,核心代码如下:

		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请求

该页面可以正常投票,截图如下:
java HttpClient使用代理IP_第3张图片

你可能感兴趣的:(java)