JAVA利用httpClient-jsoup-chromeDriver设置IP代理或者三方动态代理

作者: admin 分类: Scrapy 发布时间: 2020-05-22 11:02  阅读: 619 views

之前尝试利用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代理或者三方动态代理

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

更多阅读