ホームページ  >  記事  >  バックエンド開発  >  HttpClient は Web ページのソース コードをクロールします

HttpClient は Web ページのソース コードをクロールします

巴扎黑
巴扎黑オリジナル
2016-12-20 12:00:301745ブラウズ

インポート java.io.BufferedReader;

インポート java.io.InputStreamReader;

インポート java.text; .SimpleDateFormat;
import java.util.Date;
import java.util.List; ;
import java.util.zip.GZIPInputStream;
import org.apache.commons.httpclient.HttpClient; apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.HttpStatus; commons.httpclient.SimpleHttpConnectionManager;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams; org.apache.commons.httpclient.params.HttpMethodParams;

/ **
* @author Liuwei
* 日付: 2009 年 12 月 18 日
*
* TODO
* HttpClient の補助クラス
* /
public class HttpClientHelper
{

/ **
* HttpClient の接続タイムアウト、読み取りデータのタイムアウト設定 (単位: ミリ秒)
* /
Public static Final int HTTPCLIENT_CONNECTION_TIMEOUT = 30000;
Public static Final int HTTPMETHOD_SO_TIMEOUT = 5000; ConnectionManager の管理 接続を閉じるかどうかwhen httpclientconnection
private static boolean alwaysClose = FALSE;
private static string defaultEncode = "UTF-8";

private static last DateFormat = new SimpleDateFormat("YYYY-MM-DD HH:MM:SS "); **
* HttpClient 接続を取得し、関連するパラメーターを設定します
*
* @return
* /
public static HttpClient の getHttpClient()
{
HttpClient client = new HttpClient (new SimpleHttpConnectionManager (alwaysClose)); ionManagerParams managerParams = クライアント.getHttpConnectionManager() getParams() メソッド。
//接続タイムアウトを設定します (ミリ秒単位)
managerParams.setConnectionTimeout (HTTPCLIENT_CONNECTION_TIMEOUT);
//読み取りデータのタイムアウトを設定します (ミリ秒単位)
クライアントに戻ります。
/ * *
* HttpClient 接続を取得し、関連するパラメーターを設定します
*
* @parameter logonSite
* @parameter logonPort
* @parameter Protocol
* @return
* /
public static HttpClient の getHttpClient (最後の文字列 logonSite、最終解釈 logonPort 、最後の文字列プロトコル)
{
HttpClient client = new HttpClient(new SimpleHttpConnectionManager(alwaysClose));
client.getHostConfiguration() setHost(logonSite, logonPort, プロトコル)。
HttpConnectionManagerParams managerParams = client.getHttpConnectionManager() getParams() メソッド。
//接続タイムアウトを設定します (ミリ秒単位)
managerParams.setConnectionTimeout (HTTPCLIENT_CONNECTION_TIMEOUT);
//読み取りデータのタイムアウトを設定します (ミリ秒単位)
クライアントに戻ります。
プライベートstatic List getHeaders(MapHeaders)
{
List = ヘッダーの配列 new ();
if ( empty = header&& false == ヘッダー) .isEmpty() )
{
set> =entrySet header.entrySet();
for (enter エントリ:entrySet)
if (false == includeUserAgent
&& "UserAgent".equals(entry.getKey()))
{
includeUserAgent = TRUE;
}
headers(new headers()entry.getKey(),entry.getValue()))
} }

if (false == includeUserAgent)
{
headers.add(new headers(
"UserAgent",
"Mozilla/4.0( と互換性があります。MSIE 7.0; Windows NT 5.1; GTB5; .NET CLR 1.1.4322; .NET CLR 2.0 0.50727; Alexa ツールバー; MAXTHON 2.0)"));
}
Return Header;
}

Private static NameValuePair [] getPairs(Map POSTDATA)
{
if (null == | | POSTDATA postData.isEmpty())
{
return
}

文字列 , 文字列 >> =
INT DATALENGTH =
NameValuePair ] = 新しい NameValuePair[DATALENGTH]
INT I = 0;
For (entryentrySet)
{
double[i++] = new NameValuePair(entry.getKey(),entry.getValue());
return ペア
}

/ **
*Web コンテンツ情報のリクエスト
*
* @parameter HttpClient
* @parameter reqUrl
*パラメータ タイトル
* @parameter POSTDATA
*パラメータ エンコーディング
* @return
* /
public static string doRequest(HttpClient HttpClient, String reqUrl,
Map ヘッダー, MapPOSTDATA, String エンコーディング)
{
String htmlContent = NULL;
if (null == HttpClient )
{
Return htmlContent;

//エンコーディング設定のリクエスト

//ヘッダーリクエスト情報
ListSystem.out.println("[" + DATE_FORMAT.format(new Date()) + "] - doRequest - " + reqUrl); <br><br>//Post メソッド <br> if (null = POSTDATA!) <br>{ <br> PostMethod PostMethod = new EncodePostMethod(reqUrl,coding); <br>for (header tempHeader: header) <br>{ <br>postMethod.setRequestHeader(tempHeader); <br><br>//Post パラメータ設定 <br>NameValuePair[] = PARAMS getPairs(POSTDATA ; <br>Other<br>{ <br>) GetMethod getMethod = 新しい実装 getMethod(reqUrl); <br>for (head tempHeader: header) <br>{ <br>getMethod.setRequestHeader(tempHeader) <br>} <br><br>//Web ページのコンテンツを抽出 <br>htmlContent =executeMethod(HttpClient , getMethod, encoding, NULL) ); <br>} <br>Return htmlContent; <br><br> プライベート静的文字列 getWebSite(String reqUrl) <br>{ <br>String website = NULL; <br> if (null == reqUrl || reqUrl.isEmpty( )) <br>{ <br>Web サイトに戻る<br>} <br><br>文字列プレフィックス = "HTTP://"; <br>if (reqUrl.startsWith(prefix)) <br>{ <br>INT インデックス = reqUrl.substring(prefix.length()) IndexOf("/") + prefix.length (); <br>Website = reqUrl.substring(0,index); <br>} <br>Web サイトに戻る <br>} <br><br>/ ** <br>* HTTPMethod を列挙して Web ページのコンテンツを取得します <br>* <br>* @parameter HttpClient <br>* requestMethod <br>* パラメータのエンコーディング <br> * パラメータのウェブサイト <br>* @return <br>* / <br> private static string useMethod (HttpClient HttpClient, enum HTTPMethod requestMethod, エンコードされた文字列, 文字列 Web サイト) <br> { <br>String responseContent = NULL; ) <br>{ <br>return responseContent; <br>} <br><br>//暗号化されたデータをリクエストするかどうかを決定する <br> Boolean dataEncrypt = FALSE; <br>Header acceptEncoding = requestMethod.getRequestHeader(" エンコーディングを受け入れる");空 = acceptEncoding <br>。 && acceptEncoding.getValue() contains("gzip")) <br>{ <br>dataEncrypt = TRUE; <br><br>InputStream responseStream = NULL; <br>INT status = httpClient.executeMethod(requestMethod) <br>if(HttpStatus .SC_OK) == ステータス) <br>{ <br>responseStream = requestMethod.getResponseBodyAsStream(); <br>responseContent = getContentByStream(dataEncrypt new GZIPInputStream(responseStream): responseStream, encoding); <br>responseStream.close() <br> //リターン コードが 30130 2303307 の場合これは、ページがリダイレクトされたことを意味し、その場所の URL を再リクエストします。これは、Cookie を取得するために一部のログイン認証が使用される場合に重要です。それ以外の場合、(HttpStatus.SC_MOVED_PERMANENTLY == ステータス <br>|| HttpStatus.SC_MOVED_TEMPORARILY = = ステータス <br>|| HttpStatus .SC_SEE_OTHER == ステータス <br>|| HttpStatus.SC_TEMPORARY_REDIRECT == ステータス) <br>{ <br> //新しい URL アドレスを読み取ります <br>Header = requestMethod.getResponseHeader("position"); ) <br>{ <br>String redirectUrl = header.getValue(); <br>if (null = redirectUrl! <br>&& false == redirectUrl.isEmpty()) <br>{ <br>responseContent = void <br>if (null == redirectUrl || redirectUrl.isEmpty; ()) <br>{ <br> redirectUrl = "/"; <br>} <br><br> if (false == redirectUrl.startsWith("http://") <br>! && empty = website) <br>{ <br> if (website.startsWith( "/ ")) <br>{ <br> redirectUrl = website + redirectUrl; <br>} <br> other <br>{ <br> redirectUrl = website + "/" + redirectUrl; <br>} <br>} <br><br>GetMethod リダイレクト = 新しい実装 getMethod( redirectUrl); <br>ヘッダリファラー = requestMethod .getRequestHeader("リファラー"); <br>if (null = リファラー! ; + } <br><br>} //ターミナル <br><br>} //終了ステータス <br><br>} の追いつき (例外 5) <br>{ <br>e.printStackTrace() <br>}最後に <br>{ <br>;If (requestMethod! = NULL) <br>{ <br>requestMethod.releaseConnection(); <br>} <br>} <br>ReturnContent; <br>} <br><br>/ ** <br>* 指定されたエンコーディングに従ってストリームから情報を読み取る <br>* <br>* @parameter inStream <br>*パラメータエンコーディング<br>* @return <br>*IOExceptionをスローします <br>* / <br>パブリック静的文字列getContentByStream(InputStream inStream, Stringエンコーディング)はIOExceptionをスローします <br>{ <br>if (null == Break) <br>{ <br> return NULL <br>} <br><br>StringBuilder content = new StringBuilder(); <br>//指定されたエンコード形式を使用してストリーム コンテンツを読み取ります <br>BufferedReader (new InputStreamReader(Interstitial, encoding)); <br>String message = NULL; .readLine())!) <br>{ <br>content.append(message); <br>content.append("r n") <br>} <br>// リーダーを閉じ、リソースを解放します <br>reader.close(); toString()); <br>} <br><br>/ ** <br>*PostMethod から継承された内部クラス。郵便リクエストのエンコード形式を指定するために使用されます <br>* / <br>EncodePostMethod によって拡張されたパブリック静的クラス PostMethod <br>{ <br> プライベート文字列エンコーディング = NULL; <br> public EncodePostMethod(URL String, String encode) <br>{ <br> super(URL); <br>this.encode = encode; <br>} <br><br>@override <br> public String getRequestCharSet() <br>{ <br> // TODO メソッド スタブを自動的に生成します <br> return ( this.encode); <br>} <br><br>} <br><br>/ ** <br>* テスト <br>* <br>* @parameter ARGS <br>* / <br> public static valid main(String[] args) <br>{ <br>//System.setProperty("http .proxyHost", "165.228.128.10"); <br>//System.setProperty("http.proxyPort", "3128"); <br> //System.setProperty("http.proxySet","true"); <br><br><br> String reqUrl = " http://news.39.net/jbyw/index.html "; <br>reqUrl = " http:// news.39.net/a/2010722/1404231.html ”; <br>Map<String, String> ; ヘッダー = 新しい HashMap <String, String>(); <br>headers.put("エンコーディングを受け入れる" , "gzip,deflate"); <br><br>HttpClient = getHttpClient();ヘッダー、null、"GBK"); <br>System.out.println(htmlContent);</string></string></string></p></div><div class="nphpQianMsg"><div class="clear"></div></div><div class="nphpQianSheng"><span>声明:</span><div>この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。</div></div></div><div class="nphpSytBox"><span>前の記事:<a class="dBlack" title="継承の概要" href="http://m.php.cn/ja/faq/345546.html">継承の概要</a></span><span>次の記事:<a class="dBlack" title="継承の概要" href="http://m.php.cn/ja/faq/345553.html">継承の概要</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>関連記事</h2><em><a href="http://m.php.cn/ja/article.html" class="bBlack"><i>続きを見る</i><b></b></a></em><div class="clear"></div></div><ul class="nphpXgwzList"><li><b></b><a href="http://m.php.cn/ja/faq/347608.html" title="C# 2.0 仕様の概要 (1)" class="aBlack">C# 2.0 仕様の概要 (1)</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ja/faq/347609.html" title="C# 2.0 仕様(二)" class="aBlack">C# 2.0 仕様(二)</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ja/faq/347610.html" title="C# 2.0 の仕様(3)" class="aBlack">C# 2.0 の仕様(3)</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ja/faq/347612.html" title="C# 2.0 仕様 (4)" class="aBlack">C# 2.0 仕様 (4)</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ja/faq/347613.html" title="C#2.0 仕様 (ジェネリック 1)" class="aBlack">C#2.0 仕様 (ジェネリック 1)</a><div class="clear"></div></li></ul></div></div><footer><div class="footer"><div class="footertop"><img src="/static/imghwm/logo.png" alt=""><p>福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!</p></div><div class="footermid"><a href="http://m.php.cn/ja/about/us.html">私たちについて</a><a href="http://m.php.cn/ja/about/disclaimer.html">免責事項</a><a href="http://m.php.cn/ja/update/article_0_1.html">Sitemap</a></div><div class="footerbottom"><p> © php.cn All rights reserved </p></div></div></footer><script>isLogin = 0;</script><script type="text/javascript" src="/static/layui/layui.js"></script><script type="text/javascript" src="/static/js/global.js?4.9.47"></script></div><script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script><link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css' type='text/css' media='all'/><script type='text/javascript' src='/static/js/viewer.min.js?1'></script><script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script><script>jQuery.fn.wait = function (func, times, interval) { var _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = this, _selector = this.selector, //选择器 _iIntervalID; //定时器id if( this.length ){ //如果已经获取到了,就直接执行函数 func && func.call(this); } else { _iIntervalID = setInterval(function() { if(!_times) { //是0就退出 clearInterval(_iIntervalID); } _times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 if( _self.length ) { //判断是否取到 func && func.call(_self); clearInterval(_iIntervalID); } }, _interval); } return this; } $("table.syntaxhighlighter").wait(function() { $('table.syntaxhighlighter').append("<p class='cnblogs_code_footer'><span class='cnblogs_code_footer_icon'></span></p>"); }); $(document).on("click", ".cnblogs_code_footer",function(){ $(this).parents('table.syntaxhighlighter').css('display','inline-table');$(this).hide(); }); $('.nphpQianCont').viewer({navbar:true,title:false,toolbar:false,movable:false,viewed:function(){$('img').click(function(){$('.viewer-close').trigger('click');});}}); </script></body></html>