爬蟲第五篇 :Java httpclient 採集內網

很多情況下,公司的電腦是加入域的,而且上外網是要通過代理上網的,這總情況下使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章