在做爬虫的时候,如何生成一个靠谱可用的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. }

转载于:https://blog.51cto.com/12477787/1887845

通用httpclient生成方式相关推荐

  1. java 下载图片流_java下载图片(通用)httpClient,io流

    httpClient下载图片 public static void downImage(CloseableHttpClient client, String imgUrl, String savePa ...

  2. Android使用Google SMSRetrieverAPI监听短信

    写在开头 google官方介绍 如果在没有读写短信权限的情况下获取用户的短信验证码呢?google为我们提供了SMSRetrieverAPI这个Api.解决了我们在用户收到短信后自动回填界面的需求.但 ...

  3. 消息幂等(去重)通用解决方案,真顶!

    以下文章来源方志朋的博客,回复"666"获面试宝典 消息中间件是分布式系统常用的组件,无论是异步化.解耦.削峰等都有广泛的应用价值.我们通常会认为,消息中间件是一个可靠的组件--这 ...

  4. Http持久连接与HttpClient连接池

    以下文章来源方志朋的博客,回复"666"获面试宝典 一.背景 HTTP协议是无状态的协议,即每一次请求都是互相独立的.因此它的最初实现是,每一个http请求都会打开一个tcp so ...

  5. HttpClient+Jericho HTML Parser 实现网页的抓取

    //转自:chenqi19831112/archive/2008/11/07/3248863.aspx Jericho HTML Parser是一个简单而功能强大的Java HTML解析器库,可以分析 ...

  6. 广州图书馆借阅抓取——httpClient的使用

    欢迎访问我的个人网站,要是能在GitHub上对网站源码给个star就更好了. 搭建自己的网站的时候,想把自己读过借过的书都想记录一下,大学也做过自己学校的借书记录的爬取,但是数据库删掉了==,只保留一 ...

  7. java 实现HTTP连接(HTTPClient)

    在实习中,使用到了http连接,一直理解的很模糊,特地写个分析整理篇.分析不到位的地方请多多指教. Http 目前通用版本为 http 1.1 . Http连接大致分为2种常用的请求--GET,POS ...

  8. HttpClient 设置不当引发的一次雪崩!

    作者 | zxcodestudy 来源 | https://blog.csdn.net/qq_16681169/article/details/94592472 一. 事件背景 我最近运维了一个网上的 ...

  9. 《Effective Java》第8章 通用程序设计

    第47条:了解和使用类库 Top 100 Java Libraries on Github 2016 Library Number of Projects Type % of projects jun ...

最新文章

  1. Xamarin开发Anroid应用介绍
  2. Java培训找什么样的机构比较好
  3. python内置函数中的 IO文件系列 open和os
  4. springboot+mybatis调用oracle存储过程
  5. python程序后台运行的实现
  6. 【数据中台】你的企业是否需要建设数据中台?
  7. TinyXml帮助文档
  8. opencv计算机视觉编程攻略 第2版,OpenCV计算机视觉编程攻略(第2版)pdf
  9. 王者归来!华为P40 Pro渲染图曝光:后置矩阵徕卡五摄模组
  10. Windows Store 开发总结——文件操作
  11. 计算机常用汉字输入法的使用,计算机的基本操作汉字输入法--.ppt
  12. vue(vue-cli+vue-router)+babel+webpack项目搭建入门 (第一步)
  13. 网页爬虫实例一(网页截屏)
  14. 聚类分析原理(动图演示)
  15. (转)以太坊(Ethereum)全零地址(0x000000...)揭秘
  16. 前端面试,面试官会问些啥...
  17. WINRAR密码去除/破解工具
  18. 代码覆盖率和功能覆盖率
  19. 自动驾驶的分级,感知与规划基本意义
  20. 如何制作360度vr全景?制作360度全景效果图有哪些技巧?

热门文章

  1. 不同品牌android手机ui,各大安卓手机品牌里,系统UI设计对比,谁赢了?
  2. python 为什么用%格式化_Python中应该使用%还是format来格式化字符串?
  3. Verilog设计实例(4)详解全类别加法器(一)
  4. 【 Vivado 】UCF到XDC之间的转换
  5. Python入门篇-数据结构堆排序Heap Sort
  6. leetcode 二分查找 Search in Rotated Sorted ArrayII
  7. Linux 创建、删除、修改 文件夹 文件命令(笔记)
  8. 剑走偏锋——用css制作一个三角形箭头
  9. beats 耳机 android,Beats耳机app
  10. linux摄像头 sdl,Linux音视频(SDL与YUV)