在做爬虫的时候,如何生成一个靠谱可用的httpclient对象是非常关键的。在踩了无数的坑之后,总结出一个较为完善的httpclient生成方式下载

可以解决以下问题:

1、设置代理问题

2、设置默认的cookiestore对象,用来保存请求中的cookie。以便进行深层次访问。

3、在请求失败的重试策略问题

4、默认useragent的问题

5、https及自签名证书的验证问题

Java代码  收藏代码

  1. /** 

  2.      * 新建一个通用httpclientbuider 

  3.      * 使用代理时,必须一起传入host对象。 

  4.      * 不传入host对象的时候,代理不会生效 

  5.      */  

  6.     public static HttpClientBuilder getInstanceClientBuilder(boolean isNeedProxy, CookieStore store, HttpHost host, HttpRequestRetryHandler handler, String userAgent) {  

  7.         org.apache.http.ssl.SSLContextBuilder context_b = SSLContextBuilder.create();  

  8.         SSLContext ssl_context = null;  

  9.         try {  

  10.             context_b.loadTrustMaterial(null, (x509Certificates, s) -> true);  

  11.             //信任所有证书,解决https证书问题  

  12.             ssl_context = context_b.build();  

  13.         } catch (Exception e) {  

  14.             e.printStackTrace();  

  15.         }  

  16.         ConnectionSocketFactory sslSocketFactory = null;  

  17.         Registry<ConnectionSocketFactory> registry = null;  

  18.         if (ssl_context != null) {  

  19.             sslSocketFactory = new SSLConnectionSocketFactory(ssl_context, new String[]{"TLSv1""TLSv1.1""TLSv1.2"}, null, (s, sslSession) -> true);  

  20.             //应用多种tls协议,解决偶尔握手中断问题  

  21.             registry = RegistryBuilder.<ConnectionSocketFactory>create().register("https", sslSocketFactory).register("http"new PlainConnectionSocketFactory()).build();  

  22.         }  下载

  23.         PoolingHttpClientConnectionManager manager = null;  

  24.         if (registry != null) {  

  25.             manager = new PoolingHttpClientConnectionManager(registry);  

  26.         } else {  

  27.             manager = new PoolingHttpClientConnectionManager();  

  28.         }  

  29.         manager.setMaxTotal(150);  

  30.         manager.setDefaultMaxPerRoute(200);  

  31.         HttpClientBuilder builder = HttpClients.custom().setRetryHandler(handler)  

  32.                 .setConnectionTimeToLive(6000, TimeUnit.SECONDS)  

  33.                 .setUserAgent(userAgent);  

  34.         if (store != null) {  

  35.             builder.setDefaultCookieStore(store);  

  36.         }  

  37.         if (isNeedProxy && host != null) {  

  38. //            HttpHost proxy = new HttpHost("127.0.0.1", 1080);// 代理ip  

  39.             DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(host);  

  40.             builder = builder.setRoutePlanner(routePlanner);  

  41.         }  

  42.         builder.setConnectionManager(manager);//httpclient连接池  

  43.         builder.setRedirectStrategy(new AllowAllRedirectStrategy());//默认重定向所有302和307,否则httpclient只自动处理get请求导致的302和307  

  44.         return builder;  

  45.     }