爬虫類第五編-Java httpclient採集内網

2715 ワード

多くの場合、会社のパソコンはドメインに加入しており、インターネットはエージェントを通じてインターネットに接続されている.この場合、httpclientを使用して外部ネットワークにアクセスする際にエージェントを使用する必要があり、NTLMを通じて検証する必要があるため、httpclientでNTLMプロトコルを使用する必要がある.
NTLMについては、こちらを参考にすることができます.この問題を解決するコードを以下に示します.
時には採集需要は社内の人員が提出し、内網bbsを採集する.
イントラネット権限認証はNTLMに基づく場合があります
そのため、リクエストのたびにヘッダに認証情報を要求する必要があります
    public static String getWithNTCredential(String url,boolean needProxy,int msTimeOut){  
            log.info("--get url:[" + url + "]");  
            String responseBody = null;  
            HttpMethod getMethod = new GetMethod(url);  
            if(msTimeOut>0) {  
                getMethod.getParams().setSoTimeout(msTimeOut);  
            }  
            log.info("--queryString:" + getMethod.getQueryString());  
            HttpClient httpClient = new HttpClient();  
      
            if (needProxy) {  
                String proxyUrl = "10.xx.xx.xx";//   IP  
                String proxyPort ="8080";//       
                String proxyUser ="xxxx";//       
                String proxyPassword ="xxxx";//        
                String domain="xxxx.COM";//         
                httpClient.getHostConfiguration().setProxy(proxyUrl,Integer.parseInt(proxyPort));  
                List authPrefs = new ArrayList(2);  
                authPrefs.add(AuthPolicy.NTLM);  
                httpClient.getParams().setParameter(HttpMethodParams.USER_AGENT,"Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1");   
                httpClient.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, authPrefs);  
                //           ,           
                NTCredentials ntc=new NTCredentials(proxyUser, proxyPassword,proxyUrl,domain);  
                httpClient.getState().setProxyCredentials(AuthScope.ANY,ntc);  
            }  
            try {  
                int statusCode = httpClient.executeMethod(getMethod);  
                log.info("http get url:" + getMethod.getURI());  
                log.info("----http status code:" + statusCode);  
                if (statusCode == HttpStatus.SC_OK ||  statusCode==HttpStatus.SC_PARTIAL_CONTENT) {  
                    responseBody =  getMethod.getResponseBodyAsString();  
                }  
            } catch (HttpException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            } finally {  
                getMethod.releaseConnection();  
            }  
            return responseBody;  
        }  

参考資料:http://www.cnblogs.com/nbpowerboy/archive/2013/05/19/3086579.html