通用httpclient生成方式

在做爬虫的时候,如何生成一个靠谱可用的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. }
时间: 2024-08-10 16:59:07

通用httpclient生成方式的相关文章

android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件

网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就能够避免每次都要又一次编写网络请求,于是基于我比較熟悉的asynchttpclient又一次二次封装了一个网络请求框架. 思路:网络请求层唯一的功能就是发送请求,接收响应数据,请求取消,cookie处理这几个功能,二次助封装后这些功能能够直接调用封装好的方法就可以. 二次助封装代码例如以下: 1.功能接口: /

爬虫概念与编程学习之如何爬取视频网站页面(用HttpClient)(二)

先看,前一期博客,理清好思路. 爬虫概念与编程学习之如何爬取网页源代码(一) 不多说,直接上代码. 编写代码 运行 <!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=Edge" /><meta http-equiv="Content-Type" content="text/html; c

Atitit.http httpclient实践java c# .net php attilax总结

1. Navtree>> net .http1 2. Httpclient理论1 2.1. 自动url转向的控制1 3. Java里面的httpclient1 4. C# .net的httpclient2 4.1.1. .NET 4.5(C#):2 4.2. 对COOKIE和SEIION支持区别3 4.3. 用户对是否自动url转向的控制3 4.4. 对用户代理服务器的支持3 5. Php的httpclient3 6. Node.js4 7. solu解决问题::4 8. ref参考资料4 8

java Webservice(一)HttpClient使用(二)

HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活.HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议

ibernate学习笔记5---实体类或属性名与数据库关键字冲突、hql命名参数、hql实现通用分页

一.实体类或属性名与数据库关键字冲突问题1.实体类名与数据库中的关键字冲突比如:实体表User与oracle中的系统表冲突解决方式1:在xml中添加table属性,指定表名,使其不与name默认相等 [html] view plaincopyprint? <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hiber

httpClient

1.HttpClient简介 http协议可以说是现在Internet上面最重要,使用最多的协议之一了,越来越多的java应用需要使用http协议来访问网络资源,特别是现在rest api的流行,HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议.HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比 在项目中需要使用http调用接口,实现了两套发送http请求的方法,一个是使用apache的httpclient提供的http链接池来发送http请求,另一个是使用java原生的HttpURLConnection来发送http请求,并对两者性能进行了对比. 使用httpclient中的链接池发送http请求 使用最新的4.5.2版httpclient进行实现.在maven中引入 <

asp.net EF+MVC+Bootstrap 通用后台管理系统

开发环境: VS2012或以上 数据库: SQL Server 2008R2或以上 基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了OA.CRM.CMS的原型实例,适合快速构建中小型互联网及行业Web系统   Framework 业务无关的底层通用机制及功能 Model基类:提供数据传输和底层的最基本的基类及接口 DAL底层:基于EF code first,提供Repository泛型方法及写历史日志 Unti

读书《HttpClient 教程》

前言 尽管java.net包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的功能.HttpClient就是寻求弥补这项空白的组件,通过提供一个有效的,保持更新的,功能丰富的软件包来实现客户端最新的HTTP标准和建议. 1. HttpClient的范围 ? 基于HttpCore[http://hc.apache.org/httpcomponents-core/index.html]的客户端HTTP运输实现库 ? 基于经典(阻塞)I/O ? 内容无关 2. 什么