摘要:當(dāng)年玩耍前言是開發(fā)中最常用的工具之一,通常大家會使用去調(diào)用遠(yuǎn)程,使用其中比較基礎(chǔ)的,長期開發(fā)爬蟲,會接觸不常用的,同時(shí)會遇到各式各樣的坑,下面會總結(jié)這些年遇到的坑坑坑坑一解決過程開發(fā)某省份移動爬蟲時(shí),加載首頁會報(bào)標(biāo)題錯(cuò)誤,嘗試各種辦法都不好
當(dāng)年玩耍httpclient 前言
httpclient是java開發(fā)中最常用的工具之一,通常大家會使用httpcilent去調(diào)用遠(yuǎn)程,使用其中比較基礎(chǔ)的api,長期開發(fā)爬蟲,會接觸httpclient不常用的api,同時(shí)會遇到各式各樣的坑,下面會總結(jié)這些年遇到的坑
坑坑坑 一:Received fatal alert: handshake_failure解決過程
開發(fā)某省份移動爬蟲時(shí),加載首頁會報(bào)標(biāo)題錯(cuò)誤,嘗試各種辦法都不好使,后來發(fā)現(xiàn)換了jdk1.8就好使
經(jīng)過長達(dá)一個(gè)星期源碼探尋,發(fā)現(xiàn)錯(cuò)誤源頭是http在握手時(shí),加密算法不支持導(dǎo)致
jdk1.8以下版本不支持256位( TLS_DHE_RSA_WITH_AES_256_CBC_SHA )
解決方案
1、需要下載jce擴(kuò)展包 http://www.oracle.com/technet...
2、替換/jre/lib/security/里面的兩個(gè)jar
3、覆蓋后如果報(bào)錯(cuò)The jurisdiction policy files are not signed by a trusted signer!,
說明下載的版本不對,要下對應(yīng)jdk版本的
二:Certificates does not conformto algorithm constraints解決過程
用mvn打包時(shí)報(bào)錯(cuò),
security.cert.CertificateException: Certificates does not conform toalgorithm constraints
原因是在java1.6之后的這個(gè)配置文件中,認(rèn)為MD2的加密方式安全性太低,因而不支持這種加密方式,同時(shí)也不支持RSA長度小于1024的密文
需要修改
JAVA_HOME/jre/lib/security/java.security
#jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
但是這樣做需要把每臺機(jī)器都改一遍,如果新加機(jī)器忘記改了,就會發(fā)生問題,需要一套方法,只在代碼層解決問題
解決方案
經(jīng)查源碼發(fā)現(xiàn)了觸發(fā)問題的代碼位置,通過強(qiáng)制繼承SSLContextBuilder,并強(qiáng)制把private的keymanagers和trustmanagers的值置空就可以解決這個(gè)問題了
static class MySSLContextBuilder extends SSLContextBuilder { static final String TLS = "TLS"; static final String SSL = "SSL"; private String protocol; private Set三:超時(shí)時(shí)間不生效keymanagers; private Set trustmanagers; private SecureRandom secureRandom; public MySSLContextBuilder() { super(); this.keymanagers = new HashSet (); this.trustmanagers = new HashSet (); } }
解決過程
很多人在使用httpclient時(shí)會到網(wǎng)上去找例子,例子中經(jīng)常會有類似這樣的設(shè)置 httpGet.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, !isAutoRelocal); 使用上面方法時(shí),發(fā)送httpclient時(shí),在讀取配置時(shí)如果發(fā)現(xiàn)getParams不為空,則會把以前設(shè)置的所有參數(shù)都不用了,而使用這里面設(shè)置的,所以超時(shí)時(shí)間會失效
解決方案
request.getParams().setParameter是過期方法,其中每一項(xiàng)參數(shù)在RequestConfig里都有對應(yīng)的,遍歷出來替換一遍即可
boolean isRedirect = true; if(request != null) { HttpParams params = request.getParams(); if (params instanceof HttpParamsNames) { // 暫時(shí)只支持這個(gè)類型 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監(jiān)聽問題
問題
開發(fā)爬蟲經(jīng)常會使用fildder來監(jiān)控網(wǎng)絡(luò)請求,但是使用httpclient時(shí)想用fildder會很難,網(wǎng)上查各種辦法,經(jīng)常都不好使,
下面為大家來排個(gè)錯(cuò),使用下面方法就可以完美解決這個(gè)問題,讓fildder監(jiān)控更容易
解決方案
首先java端 // client builder HttpClientBuilder builder = HttpClients.custom(); if(useFidder) { // 默認(rèn)fidder寫死 builder.setProxy(new HttpHost("127.0.0.1", 8888)); } fildder端 tools->fiddler options->https->actions->export root certificate to ...五:支持gzipinkeytool.exe -import -file C:Users DesktopFiddlerRoot.cer -keystore FiddlerKeystore -alias Fiddler
問題及方案
有些網(wǎng)站返回進(jìn)行了gzip壓縮,返回內(nèi)容是壓縮的結(jié)果,需要解壓
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())); } } } } })總結(jié)
上面一些能想起來的坑,還會遇到很多問題,歡迎來討論 做一個(gè)廣告:想簡單開發(fā)爬蟲的歡迎使用uncs
作者:劉鵬飛 宜信技術(shù)學(xué)院
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/73176.html
摘要:最近在維護(hù)一個(gè)三年前的舊代碼,用的是框架。單元測試和語言并發(fā)控制實(shí)際上是個(gè)蛋疼的問題,夸張一點(diǎn)說,當(dāng)時(shí)的并不能特別輕松地實(shí)現(xiàn)并發(fā),甚至不能實(shí)現(xiàn)并發(fā)。語言的功能之一就是自帶單元測試。用語言之前,我的習(xí)慣是不寫單元測試。 最近在維護(hù)一個(gè)三年前的舊代碼,用的是laravel框架。 從某些方面來講,這個(gè)代碼算是比較標(biāo)準(zhǔn)為了實(shí)現(xiàn)在規(guī)定的時(shí)間內(nèi)完成相關(guān)功能,同時(shí)程序員水平不高、經(jīng)過大量優(yōu)化之后,變...
摘要:關(guān)于降低鎖的競爭程度從奶爸的角度思考題外話這篇文章的靈感來源于近日帶娃耍。具體可參考定律,大致可理解為處理器的利用率與處理器數(shù)量和串行比例成反比,此外,在鎖上發(fā)生競爭,導(dǎo)致上下文切換的開銷增加,進(jìn)而降低程序的性能。 關(guān)于降低鎖的競爭程度------從奶爸的角度思考 題外話:這篇文章的靈感來源于近日帶娃耍。 鎖競爭帶來的問題 在鎖上發(fā)生競爭,導(dǎo)致串行操作花費(fèi)的時(shí)間比例增加,進(jìn)而降低程序...
摘要:屬性,可以函數(shù)的名字在代碼運(yùn)行期間動態(tài)增加功能的方式,稱之為裝飾器。本質(zhì)上,就是一個(gè)返回函數(shù)的高階函數(shù)。比如,定義一個(gè)能打印日志的。接受函數(shù)作為參數(shù),要放置在函數(shù)定義處。一個(gè)完整的的代碼如下記錄的是傳入的的值,位置在嵌套內(nèi)或者帶參數(shù)的如下。 又是一段叨叨 如果總是擔(dān)心能不能做到的話,那就干脆不要做了。想做的事情還是一往無前的好,什么都不想,就努力沖沖沖吧! 裝飾器 因?yàn)楹瘮?shù)是一個(gè)對象。...
摘要:自定義是請求響應(yīng)式的,本是無狀態(tài)的,不過應(yīng)用通常需要在幾個(gè)連續(xù)的請求之間保持聯(lián)系,因此可以使用這個(gè)來傳遞變量,注意這個(gè)不是線程安全的,建議每個(gè)線程使用一個(gè)。這個(gè)方法是線程安全的,而且可以從任意線程中調(diào)用。協(xié)議攔截器必須實(shí)現(xiàn)為線程安全的。 1、關(guān)閉流和response CloseableHttpClient httpclient = HttpClients.createDefault()...
序 本文主要研究一下Java11的HttpClient的基本使用。 變化 從java9的jdk.incubator.httpclient模塊遷移到j(luò)ava.net.http模塊,包名由jdk.incubator.http改為java.net.http 原來的諸如HttpResponse.BodyHandler.asString()方法變更為HttpResponse.BodyHandlers.of...
閱讀 2160·2021-11-12 10:36
閱讀 2155·2021-09-03 10:41
閱讀 2769·2021-08-19 10:57
閱讀 1238·2021-08-17 10:14
閱讀 1495·2019-08-30 15:53
閱讀 1216·2019-08-30 15:43
閱讀 979·2019-08-30 13:16
閱讀 2988·2019-08-29 16:56