JAVA利用httpClient-jsoup-chromeDriver设置IP代理或者三方动态代理
之前尝试利用JAVA处理图片点选验证码失败【点击这里】,遂改变思路通过设置IP代理来达到效果。
首先在JAVA中设置代理可以通过httpClient设置,也可以通过Jsoup设置;当你使用了selenium工具进行模拟操作时,还可以通过设置ChromeDriver的option选项来处理。具体情况根据自己使用的框架/结构来使用。
1. httpclient设置
这里使用的是httpclient4.5.3
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
具体实现代码如下:
//利用httpclient设置代理
public void httpClient() {
// 请求返回
CloseableHttpResponse httpResp = null;
try {
// 设置代理IP、端口、协议(请分别替换)
HttpHost proxy = new HttpHost("你的代理的IP", 8080, "http");
// 把代理设置到请求配置
RequestConfig defaultRequestConfig = RequestConfig.custom().setProxy(proxy).build();
// 实例化CloseableHttpClient对象
CloseableHttpClient httpclient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();
// 访问目标地址
HttpGet httpGet = new HttpGet("http://www.baidu.com");
httpGet.addHeader("Proxy-Authorization", "三方代理身份凭证"); //是一个请求首部,其中包含了用户代理提供给代理服务器的用于身份验证的凭证
httpResp = httpclient.execute(httpGet);
int statusCode = httpResp.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
System.out.println("成功");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
httpResp.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.Jsoup设置
由于原装Jsoup是没有提供proxy功能的,需要去网上查找带有proxy代理功能的包。然后操作如下:
Document doc = null ;
try {
long a = System.currentTimeMillis();
doc = Jsoup.connect(url)
//.proxy(ip, port,null) //这个需要下载有代理功能的jsoup包
.validateTLSCertificates(false)//忽略证书认证,每种语言客户端都有类似的API
.header("Proxy-Authorization", authHeader) //提供给代理服务器的用于身份验证的凭证
.userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36")
.timeout(10000)
.get();
Thread.sleep(1000);
} catch (Exception e) {
}
3.Selenium中的ChromeDriver设置
可以使用谷歌驱动或者火狐驱动或者其他,都类似
ChromeOptions options = new ChromeOptions();
// 设置代理ip
String ip = "ip:port";
options.addArguments("--proxy-server=http://" + ip);
options.addArguments("Proxy-Authorization=xxxxxxx");
4.JAVA框架 webmagic中设置代理
这里其使用的0.7.3版本,
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.3</version>
</dependency>
之前的版本,设置方式可能会有不一样,具体可以查看源码处理。
@RequestMapping(value = "/acl", method = RequestMethod.GET)
@ResponseBody
public void testProxy() {
ProxyTextProcessor processor = new ProxyTextProcessor();
CityDataPipeline pipe = new CityDataPipeline();
HttpClientDownloader httpClientDownloader = new HttpClientDownloader();
httpClientDownloader.setProxyProvider(SimpleProxyProvider.from(new Proxy("daili.com",8088,null,null)));
String[] urls = new String[1];
urls[0]="https://xxx.xxx.com/detail?cid=e172f20ef00ca3143348ec093db4d647_law&highlight=%E5%A9%9A%E5%A7%BB%E6%B3%95&searchType=statute";
Spider.create(processor).setDownloader(httpClientDownloader).addUrl(urls).addPipeline(pipe).thread(4).run();
}
如果需要设置header信息,在具体的processor中设置,按需处理。
简单测试后,查看nginx的access.log访问日志,可以看到每次访问的IP是不一样的。
180.122.144.135 - - [21/May/2020:18:48:56 +0800] "GET /734.html HTTP/1.1" 200 50299 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"
114.230.127.122 - - [21/May/2020:18:48:56 +0800] "GET /1394.html HTTP/1.1" 200 55031 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"
125.87.96.211 - - [21/May/2020:18:48:57 +0800] "GET /1255.html HTTP/1.1" 200 49458 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"
37.187.74.109 - - [21/May/2020:18:49:04 +0800] "POST /wp-login.php HTTP/1.1" 200 3306 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"
117.95.14.120 - - [21/May/2020:18:49:07 +0800] "GET /690.html HTTP/1.1" 200 51122 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"
...
...
...
但是兵来将挡水来土掩,服务端可以根据user-agent信息\ip访问频次等信息进行拦截,应该也是一种很巧妙的设计吧。
相关请了解爬虫相关
原创文章,转载请标明本文链接: JAVA利用httpClient-jsoup-chromeDriver设置IP代理或者三方动态代理