• HTTP代理


    代理是爬虫技术中很重要的一项。因为有一些网站会有相应的安全策略。例如检测一段时间内,某个IP地址的访问次数,如果访问频率过高,说明你不是正常访客,然后禁止你这个IP的访问。

    应对这种机制有两种手段:

    • 放慢抓取速度,减小对目标网站的访问压力。
    • 设置代理IP,实现高频率抓取,但是这需要多个稳定的代理IP。

    HttpClient支持设置代理。

    CloseableHttpClient httpclient = HttpClients.createDefault();
    
    /**
     * 第一种方式:最简单
     * proxyHost:代理IP
     * proxyPort:代理端口号
     * 注意:new HttpHost()是支持指定协议类型的,但是httpClient不默认支持socks协议,
     *      所以如果我们把上面代码中的协议改成new HttpHost("proxyHost", proxyPort, "SOCKS"),会报错。
     */
    HttpHost proxy = new HttpHost("proxyHost", 900, "HTTP");
    HttpGet get = new HttpGet("192.168.1.1:8080/findUser");
    
    CloseableHttpResponse response = httpclient.execute(proxy, get);
    CloseableHttpClient httpclient = HttpClients.createDefault();
            
    /**
     * 第二种方式
     */
    HttpGet httpGet = new HttpGet("192.168.1.1:8080/findUser");
    
    httpGet.setConfig(
            RequestConfig.custom()
                    .setProxy(new HttpHost("proxyHost", proxyPort, "HTTP"))
                    .build()
    );
    
    CloseableHttpResponse response = httpclient.execute(httpGet);
    /**
     * 第三种方式:使用RoutePlanner
     */
    HttpClientBuilder httpClientBuilder = HttpClients.custom();
    
    //<1> 使用默认
    HttpHost proxy = new HttpHost("proxyHost", proxyPort);
    DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
    httpClientBuilder.setRoutePlanner(routePlanner);
    
    //<2>或者使用标准的JRE代理选择器,即使用系统代理
    SystemDefaultRoutePlanner systemRoutePlanner = new SystemDefaultRoutePlanner(
            ProxySelector.getDefault());
    httpClientBuilder.setRoutePlanner(systemRoutePlanner ); 
    CloseableHttpClient httpClient
    = httpClientBuilder.build();

    1. RoutePlanner

    在httpClient的请求执行过程中,HttpRoute首先出现在请求执行链的入口处,在进入请求执行链之前,使用routePlanner来根据目标主机、请求和请求上下文来计算出HttpRoute。详见InternalHttpClient#doExecute源码。

    HttpClient默认计算HttpRoute的算法大致为:

    • 如果在请求上下文context里能找到代理,直接用来创建HttpRoute对象;
    • 如果没有设置代理,并且没有使用系统属性,用DefaultRoutePlanner,计算出的HttpRoute的proxyChain为null;
    • 如果设置了代理,用DefaultProxyRoutePlanner,计算出的HttpRoute的proxyChain里只有一个,就是设置的代理;
    • 如果没有设置代理,但使用系统数据,用SystemDefaultRoutePlanner,它使用JDK的ProxySelector,从JVM配置和系统配置里获取代理链,再从代理链里寻找第一个HTTP类型的代理,来创建HttpRoute对象。如果没有找到HTTP类型的代理,计算出的HttpRoute的proxyChain为null.

    2. 如何设置系统代理

    注:系统代理配置指的 JVM 系统,而不是操作系统。

    使用Java System类可以设置 HTTP 代理,HTTPS 代理和 SOCKS 代理:

    // HTTP 代理,只能代理 HTTP 请求
    System.setProperty("http.proxyHost", "127.0.0.1");
    System.setProperty("http.proxyPort", "9876");
     
    // HTTPS 代理,只能代理 HTTPS 请求
    System.setProperty("https.proxyHost", "127.0.0.1");
    System.setProperty("https.proxyPort", "9876");
     
    // 同时支持代理 HTTP/HTTPS 请求
    System.setProperty("proxyHost", "127.0.0.1");
    System.setProperty("proxyPort", "9876");
    
    // SOCKS 代理,支持 HTTP 和 HTTPS 请求
    // 注意:如果设置了 SOCKS 代理就不要设 HTTP/HTTPS 代理
    System.setProperty("socksProxyHost", "127.0.0.1");
    System.setProperty("socksProxyPort", "1080");

    当然也可以使用JVM命令行参数,如果是IDE项目,可以在启动设置中设置JVM 参数:

  • 相关阅读:
    githubz在add ssh key报错 Key is invalid. Ensure you've copied the file correctly 解决办法
    iOS 更改状态栏颜色
    iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile?
    iOS UIWebView加载网页、文件、HTML
    XXX is undefine,全局搜索却只得到一个结果
    接口调用报错,全局搜索却找不到?vscode vue
    elementui下拉框选择一次以后再选,多项被选中的情况
    VUE+ elementui 表单rules validator 邮箱验证、电话号码验证、身份证验证、账号验证
    JS 验证input内容框 Demo(复制可测试)
    Vscode setting.json个人设置(包含保存格式化,空格、换行,标点符号自动增删)
  • 原文地址:https://www.cnblogs.com/myitnews/p/12204781.html
Copyright © 2020-2023  润新知