首頁 > 後端開發 > C#.Net教程 > HttpClient的爬取網頁原始碼

HttpClient的爬取網頁原始碼

巴扎黑
發布: 2016-12-20 12:00:30
原創
1771 人瀏覽過

包UTIL;

進口java.io.BufferedReader中; 
進口java.io.IOException異常; 
進口的java.io.InputStream; 
進口java.io.InputStreamReader中; 
進口.
進口java.text.SimpleDateFormat的; 
進口的java.util.ArrayList; 
進口java.util.Date; 
進口的java.util.HashMap; 
進口的java.util.List .Map; 
進口java.util.Set中; 
進口java.util.Map.Entry; 
進口java.util.zip.GZIPInputStream;

進口org.apache.commons.httpclient.HeaderStream;


進口org.apache.commons.httpclient.Header; .commons.httpclient.HttpClient; 
進口org.apache.commons.httpclient.HttpException; 
進口org.apache.commons.httpclient.HttpMethod; 
進口org.apache.commons.httpclient.HttpMethod; 
進口org.apache.commons.httpclient.Http .httpclient.NameValuePair; 
進口org.apache.commons.httpclient.SimpleHttpConnectionManager; 
進口org.apache.commons.httpclient.methods.GetMethod; 
進口org.apache.commons.httpclicli.com .commons.httpclient.params.HttpConnectionManagerParams; 
進口org.apache.commons.httpclient.params.HttpMethodParams;

/ ** 
* @author六味
*日期:2009年12月18日

* TODO 
* HttpClient的輔助類
* / 
publicHtttt超時,讀取資料逾時時間設定(單位:毫秒)
* / 
公共靜態最終詮釋HTTPCLIENT_CONNECTION_TIMEOUT = 30000; 
公共靜態最終詮釋HTTPCLIENT_SO_TIMEOUT = 1200000; //讓的ConnectionManager管理httpclientconnection時是否關閉連接
私有靜態布林alwaysClose = FALSE; 
私人靜態字串defaultEncode =「UTF-8」; 

私有靜態最後的DateFormat DATE_FORMAT =新的SimpleDateFormat(「YY ”); 

/ ** 
*取得HttpClient的連接,並設定相關參數

* @return 
* / 
公用靜態HttpClient的getHttpClient(ClYcom (alwaysClose)); 
HttpConnectionManagerParams managerParams = client.getHttpConnectionManager()getParams()方法。
//設置連接超時時間(單位毫秒)
managerParams.setConnectionTimeout(HTTPCLIENT_CONNECTION_TIMEOUT); 
//設置讀數據超時時間(單位毫秒)
managerParams.setSoTimeout(HTTPCLIENT_SO_TIMEOUT); 
返回客戶端; 


/ * * 
*取得HttpClient的連接,並設定相關參數

* @參數logonSite 
* @參數logonPort 
* @參數協定
* @return 
* / 
* @參數協定
* @return ? logonPort,最後弦樂協定)

HttpClient的客戶端=新的HttpClient(新SimpleHttpConnectionManager(alwaysClose)); 
client.getHostConfiguration()setHost(logonSite,logonPort,協定)。
HttpConnectionManagerParams managerParams = client.getHttpConnectionManager()getParams()方法。
//設定連線逾時時間(單位毫秒)
managerParams.setConnectionTimeout(HTTPCLIENT_CONNECTION_TIMEOUT); 
//設定讀取資料逾時時間(單位毫秒)
managerParams.setSoTimeout(HTTPCLIENT_SO_TIME列表 getHeaders(地圖頭)

名單 =報頭的ArrayList新(); 
布爾includeUserAgent = FALSE; 
如果(空=頭&&假== header .isEmpty()! == includeUserAgent 
&&「使用者代理程式」.equals(entry.getKey()))

includeUserAgent = TRUE; 

headers.add(新標頭(entry.getKey(Key),entry.get(Key),entry.get(Key),entry.get(Key),entry.get(Key),entry);



如果(假== includeUserAgent)

headers.add(新標題(
“用戶代理”,
“Mozilla的/ 4.0(兼容; MSIE 7.0; Windows 的5.NET; CLR 1.1.4322; .NET CLR 2.0 0.50727; Alexa工具條; MAXTHON 2.0)“)); 

返回頭; 


私有{ 
如果(空== || POSTDATA postData.isEmpty())

回傳NULL; 


設定> =的entrySet postData.entrySet(); entrySet.size(); 
的NameValuePair [] =對新的NameValuePair [DATALENGTH] 
INT I = 0; 
對於(進入項目:的entrySet)

雙[我++] =新的NameValuePair(entry.getKey(),entry.getValue()); 

傳回; 


/ ** 
*請求網頁內容資訊
* *參數標題
* @參數POSTDATA 
*參數編碼
* @return 
* / 
公共靜態字串doRequest(HttpClient的HttpClient的,字串reqUrl,
地圖的頭, POSTDATA,字串編碼)

字串htmlContent = NULL; 
如果(空== HttpClient的)

回傳htmlContent; 


//請要求回填編號defaultEncode:編碼); 

//頭部請求資訊
列表 =頭getHeaders(頭); 

的System.out.println(“[”+ DATE_FORMAT.format(新的Date())+“] - doRequest - ”+ reqUrl); 

//交方式
,如果(空= POSTDATA!)

的PostMethod的PostMethod =新EncodePostMethod(reqUrl,編碼); 
對於(頭tempHeader:頭)

postMethod.setRequestHeader(tempHeader); 


//後參數設定PairName/ ); 
如果(空=參數!)

postMethod.setRequestBody(PARAMS); 


//提取網頁內容
htmlContent = executeMethod(HttpClient
//提取網頁內容
htmlContent = executeMethod(HttpClient)的,後方法,
其他

GetMethod getMethod =新的實作getMethod(reqUrl); 
對於(頭tempHeader:頭)

getMethod.setRequestHeader(tempHeader); ,getMethod,編碼,NULL); 

回傳htmlContent; 


私有靜態字串getWebSite(字串reqUrl)

字串網站= NULL; ))

回網站; 


字串字首=「HTTP://」; 
如果(reqUrl.startsWith(字首))

INT指數= reqUrl.startsWith(字首))

INT指數= reqUrl.subing(字首)的字節(prefix) indexOf(「/」)+ prefix.length(); 
網站= reqUrl.substring(0,索引); 

回網站; 


/ **生活@參數的HttpClient 
* @參數requestMethod 
*參數編碼
*參數的網站
* @return 
* / 
私有靜態字串executeMethod(HttpClient的HttpClient的,列舉HTTPMethod request { 
字串responseContent = NULL; 
如果(空== HttpClient的)

傳回responseContent; 


//SEApatceptionalatquestionalpatquestional的布林識別.接受編碼」); 
如果(!空= acceptEncoding 
。 && acceptEncoding.getValue()包含(「gzip的」))

dataEncrypt = TRUE; 


的InputStream responseStream = N .SC_OK ==狀態)

responseStream = requestMethod.getResponseBodyAsStream(); 
responseContent = getContentByStream(dataEncry🠎🠎):responStreamStream,編碼)傳回01302303307時,表示頁面己經重定向,則重新請求位置的URL,這在一些登入授權取餅乾時很重要
否則,如果(HttpStatus.SC_MOVED_PERMANENTLY ==狀態
|| HttpStatus.SC_MOVED_TEMPORARILY ==狀態
|| HttpStatus.SC_MOVED_TEMPORARILY ==狀態
|| HttpStatus .SC_SEE_OTHER ==狀態
|| HttpStatus.SC_TEMPORARY_REDIRECT ==狀態)

//讀取新的URL位址
頭球沖頂= requestMethod.getResponseHeader(「位置」);頭球沖頂= requestMethod.getResponseHeader(「位置」);
字串的redirectUrl = header.getValue(); 
如果(零=的redirectUrl!
&&假== redirectUrl.isEmpty())

responseContent_無效; isEmpty())

的redirectUrl =「/」; 


如果(假== redirectUrl.startsWith(「HTTP://」)
!&&空=網站)
「/」))

的redirectUrl =網站+的redirectUrl; 

其他

的redirectUrl =網站+「/」+的redirectUrl;的redirectUrl); 
頭引薦= requestMethod.getRequestHeader(「引薦」); 
如果(空=引用者! )

redirect.addRequestHeader(引薦); 

頭的cookie = requestMethod.getRequestHeader(「餅乾」); 
如果(空=餅乾!)

red); = httpClient.executeMethod(重新導向); 
如果(HttpStatus.SC_OK ==狀態)

responseStream = redirect.getResponseBodyAsStream(); 



} //端頭

} //結束狀態

}趕上(例外五)

e.printStackTrace(); 
}最後

如果(requestMethod!= NULL)

requestMethod.releaseConnection(); 


傳回responseContent; 

*
*參數編碼
* @回傳
*引發IOException 
* / 
公用靜態字串getContentByStream(的InputStream inStream中,字串編碼)拋出IOException異常

如果(空格回NULL; 


StringBuilder的內容=新的StringBuilder(); 
//採用指定編碼格式讀取流內容
的BufferedReader讀者=新的BufferedReader(新的InputStreamReader(插播廣告,編碼));訊息= NULL; 
而(空=(訊息= reader.readLine())!)

content.append(訊息); 
content.append(「 r n」); 

/////關閉讀取器,釋放資源
reader.close(); 
返回(content.toString()); 


/ ** 
*內部類,繼承於的PostMethod,用來指定郵政請求編碼格式
* / 
公共靜態類EncodePostMethod擴展的PostMethod 

私人字符串編碼= NULL; 

公共EncodePostMethod(URL字串,字串編碼)

超(URL); 
this.encode ={ 
超(URL); 字串getRequestCharSet()

// TODO自動產生方法存根
回報(this.encode); 




/ ** 
*測試


/ ** 
*測試
*測試
* *的主要(字符串[] args)

//System.setProperty("http.proxyHost“,”165.228.128.10“); 
//System.setProperty("http.proxyPort“,”3128“); //System.setProperty("http.proxySet“,”真“); 


字串reqUrl =“ http://news.39.net/jbyw/index.html ”; 
reqUrl =“ http:// news.39.net/a/2010722/1404231.html ”; 
地圖標題=新的HashMap (); 
headers.put(「接受編碼”,「gzip的,放氣」); 

HttpClient的HttpClient的= getHttpClient(); 
字串htmlContent = doRequest(HttpClient的,reqUrl,頭,空,「GBK」); 的lnSystemContout.print;

}



相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板