從頭學習爬蟲(八)進階篇----https
阿新 • • 發佈:2019-02-11
本文主要講解https。
首先要提到ssl證書,看看網路解釋。
什麼是 SSL 證書? SSL 證書就是遵守 SSL 安全套接層協議的伺服器數字證書。而 SSL 安全協議最初是由美國網景 Netscape Communication 公司設計開發的,全稱為:安全套接層協議 (Secure Sockets Layer) , 它指定了在應用程式協議 ( 如 HTTP 、 Telnet 、 FTP) 和 TCP/IP 之間提供資料安全性分層的機制,它是在傳輸通訊協議 (TCP/IP) 上實現的一種安全協議,採用公開金鑰技術,它為 TCP/IP 連線提供資料加密、伺服器認證、訊息完整性以及可選的客戶機認證。由於此協議很好地解決了網際網路明文傳輸的不安全問題,很快得到了業界的支援,並已經成為國際標準。
SSL 證書由瀏覽器中“受信任的根證書頒發機構”在驗證伺服器身份後頒發,具有網站身份驗證和加密傳輸雙重功能。
在請求https程式碼裡經常報的錯都是ssl,苦惱了了半天。
我總結兩條
1繞過
2配置
主要看下程式碼實現吧
摘自網路:
- /**
- * 繞過驗證
- *
- * @return
- * @throws NoSuchAlgorithmException
- * @throws KeyManagementException
- */
- publicstatic SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
- SSLContext sc = SSLContext.getInstance("SSLv3");
- // 實現一個X509TrustManager介面,用於繞過驗證,不用修改裡面的方法
- X509TrustManager trustManager = new X509TrustManager() {
- @Override
- publicvoid checkClientTrusted(
- java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
- String paramString) throws
- }
- @Override
- publicvoid checkServerTrusted(
- java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
- String paramString) throws CertificateException {
- }
- @Override
- public java.security.cert.X509Certificate[] getAcceptedIssuers() {
- returnnull;
- }
- };
- sc.init(null, new TrustManager[] { trustManager }, null);
- return sc;
- }
- /**
- * 模擬請求
- *
- * @param url 資源地址
- * @param map 引數列表
- * @param encoding 編碼
- * @return
- * @throws NoSuchAlgorithmException
- * @throws KeyManagementException
- * @throws IOException
- * @throws ClientProtocolException
- */
- publicstatic String send(String url, Map<String,String> map,String encoding) throws KeyManagementException, NoSuchAlgorithmException, ClientProtocolException, IOException {
- String body = "";
- //採用繞過驗證的方式處理https請求
- SSLContext sslcontext = createIgnoreVerifySSL();
- // 設定協議http和https對應的處理socket連結工廠的物件
- Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
- .register("http", PlainConnectionSocketFactory.INSTANCE)
- .register("https", new SSLConnectionSocketFactory(sslcontext))
- .build();
- PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
- HttpClients.custom().setConnectionManager(connManager);
- //建立自定義的httpclient物件
- CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
- / CloseableHttpClient client = HttpClients.createDefault();
- //建立post方式請求物件
- HttpPost httpPost = new HttpPost(url);
- //裝填引數
- List<NameValuePair> nvps = new ArrayList<NameValuePair>();
- if(map!=null){
- for (Entry<String, String> entry : map.entrySet()) {
- nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
- }
- }
- //設定引數到請求物件中
- httpPost.setEntity(new UrlEncodedFormEntity(nvps, encoding));
- System.out.println("請求地址:"+url);
- System.out.println("請求引數:"+nvps.toString());
- //設定header資訊
- //指定報文頭【Content-type】、【User-Agent】
- httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
- httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
- //執行請求操作,並拿到結果(同步阻塞)
- CloseableHttpResponse response = client.execute(httpPost);
- //獲取結果實體
- HttpEntity entity = response.getEntity();
- if (entity != null) {
- //按指定編碼轉換結果實體為String型別
- body = EntityUtils.toString(entity, encoding);
- }
- EntityUtils.consume(entity);
- //釋放連結
- response.close();
- return body;
- }