内容简介:request.getParams().setParameter是过期方法,其中每一项参数在RequestConfig里都有对应的,遍历出来替换一遍即可有些网站返回进行了gzip压缩,返回内容是压缩的结果,需要解压
前言
httpclient是 java 开发中最常用的 工具 之一,通常大家会使用httpcilent去调用远程,使用其中比较基础的api,长期开发爬虫,会接触httpclient不常用的api,同时会遇到各式各样的坑,下面会总结这些年遇到的坑
坑坑坑
一:Received fatal alert: handshake_failure
- 解决过程
开发某省份移动爬虫时,加载首页会报标题错误,尝试各种办法都不好使,后来发现换了jdk1.8就好使 经过长达一个星期源码探寻,发现错误源头是http在握手时,加密算法不支持导致 jdk1.8以下版本不支持256位( TLS_DHE_RSA_WITH_AES_256_CBC_SHA )
- 解决方案
1、需要下载jce扩展包 http://www.oracle.com/technetwork/cn/java/javase/downloads/jce-7-download-432124.html 2、替换/jre/lib/security/里面的两个jar 3、覆盖后如果报错The jurisdiction policy files are not signed by a trusted signer!, 说明下载的版本不对,要下对应jdk版本的
二:Certificates does not conformto algorithm constraints
- 解决过程
用mvn打包时报错, security.cert.CertificateException: Certificates does not conform toalgorithm constraints 原因是在java1.6之后的这个配置文件中,认为MD2的加密方式安全性太低,因而不支持这种加密方式,同时也不支持RSA长度小于1024的密文 需要修改 JAVA_HOME/jre/lib/security/java.security #jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024 但是这样做需要把每台机器都改一遍,如果新加机器忘记改了,就会发生问题,需要一套方法,只在代码层解决问题
-
解决方案
经查源码发现了触发问题的代码位置,通过强制继承SSLContextBuilder,并强制把private的keymanagers和trustmanagers的值置空就可以解决这个问题了
static class MySSLContextBuilder extends SSLContextBuilder { static final String TLS = "TLS"; static final String SSL = "SSL"; private String protocol; private Set<keymanager> keymanagers; private Set<trustmanager> trustmanagers; private SecureRandom secureRandom; public MySSLContextBuilder() { super(); this.keymanagers = new HashSet<keymanager>(); this.trustmanagers = new HashSet<trustmanager>(); } }
三:超时时间不生效
- 解决过程
很多人在使用httpclient时会到网上去找例子,例子中经常会有类似这样的设置 httpGet.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, !isAutoRelocal); 使用上面方法时,发送httpclient时,在读取配置时如果发现getParams不为空,则会把以前设置的所有参数都不用了,而使用这里面设置的,所以超时时间会失效
- 解决方案
request.getParams().setParameter是过期方法,其中每一项参数在RequestConfig里都有对应的,遍历出来替换一遍即可
boolean isRedirect = true; if(request != null) { HttpParams params = request.getParams(); if (params instanceof HttpParamsNames) { // 暂时只支持这个类型 isRedirect = params.getBooleanParameter( ClientPNames.HANDLE_REDIRECTS, true); } // 清空request request.setParams(new BasicHttpParams()); } if(timeOut > 0) { builder = RequestConfig.custom().setConnectionRequestTimeout(timeOut).setConnectTimeout(timeOut).setSocketTimeout(timeOut).setRedirectsEnabled(isRedirect).setCookieSpec(CookieSpecs.BEST_MATCH); } else { builder = RequestConfig.custom().setConnectionRequestTimeout(connectionTimeout).setConnectTimeout(connectionTimeout).setRedirectsEnabled(isRedirect).setSocketTimeout(socketTimeout).setCookieSpec(CookieSpecs.BEST_MATCH); }
四:fildder监听问题
- 问题
开发爬虫经常会使用fildder来监控网络请求,但是使用httpclient时想用fildder会很难,网上查各种办法,经常都不好使, 下面为大家来排个错,使用下面方法就可以完美解决这个问题,让fildder监控更容易
- 解决方案
首先java端 // client builder HttpClientBuilder builder = HttpClients.custom(); if(useFidder) { // 默认fidder写死 builder.setProxy(new HttpHost("127.0.0.1", 8888)); } fildder端 tools->fiddler options->https->actions->export root certificate to ... <jdk_home>\bin\keytool.exe -import -file C:\Users\<username>\Desktop\FiddlerRoot.cer -keystore FiddlerKeystore -alias Fiddler
五:支持gzip
- 问题及方案
有些网站返回进行了gzip压缩,返回内容是压缩的结果,需要解压
HttpClient wrappedHttpClient = builder.setUserAgent(requestUA) .addInterceptorLast(new HttpResponseInterceptor() { @Override public void process(HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException { HttpEntity httpEntity = httpResponse.getEntity(); Header header = httpEntity.getContentEncoding(); if (header != null) { for (HeaderElement element : header.getElements()) { if ("gzip".equalsIgnoreCase(element.getName())) { httpResponse.setEntity(new GzipDecompressingEntity(httpResponse.getEntity())); } } } } })
总结
上面一些能想起来的坑,还会遇到很多问题,欢迎来讨论
做一个广告:想简单开发爬虫的欢迎使用uncs
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Google御用網頁語言Node.js
郭家寶 / 佳魁資訊 / 2013-4-26 / NT 490
這是一本 Node.js 的入門教學,寫給想要學習 Node.js,但沒有任何系統的經驗的開發者。如果你聽說過 Node.js,並被它許多神奇的特性吸引,本書就是為你準備的。 透過閱讀本書,你可以對 Node.js 有全面的認識,學會如何用 Node.js 程式設計,了解事件驅動、非同步式 I/O 的程式設計模式,同時還可以了解一些使用JavaScript 進行函數式程式設計的方法。 ......一起来看看 《Google御用網頁語言Node.js》 这本书的介绍吧!