爬虫類のエントリー手続きとHttpClientを使用

ケースを取得します:

  Mavenのプロジェクト、依存性の導入を作成します。1.:

< 依存性> 
    <! - HttpClientを- > 
    < 依存> 
        < groupIdを> org.apache.httpcomponents </ groupIdを> 
        < たartifactId > HTTPClientの</ たartifactId > 
        < バージョン> 4.5.3 </ バージョン> 
    </ 依存関係> 
    <! - 日志- > 
    < 依存> 
        < groupIdを> org.slf4j </ groupIdを> 
        <たartifactId> SLF4J-log4j12 </ たartifactId > 
        < バージョン> 1.7.25 </ バージョン> 
    </ 依存関係> 
    <! - JUnitの- > 
    < 依存> 
        < groupIdを> JUnitの</ groupIdを> 
        < たartifactId > JUnitの</ たartifactId > 
        < バージョン> 4.12 </ バージョン> 
    </ 依存関係> 
</ 依存関係>

  2.追加log4j.properties

log4j.rootLogger = DEBUG、A1 
log4j.logger.com.fgy = DEBUG 

log4j.appender.A1 = org.apache.log4j.ConsoleAppender 
log4j.appender.A1.layout = org.apache.log4j.PatternLayout 
log4j.appender.A1。 layout.ConversionPattern =% - D {YYYY-MM-DD HH:MM:SS、SSS} [%T] [%C] - [%P]%のm個の%nを

  テストコード、データ・キャプチャーを書く3。

@Test
 公共 ボイド testFirst()スローIOExceptionが{ 
    CloseableHttpClientクライアント = HttpClients.createDefault()。
    HTTPGET HTTPGET =  HTTPGET( "https://www.cnblogs.com/roadlandscape/" ); 
    CloseableHttpResponse応答 = client.execute(HTTPGET)。
    もし(response.getStatusLine()getStatusCode()== 200 ){ 
        文字列のコンテキスト = EntityUtils.toString(response.getEntity()、 "UTF-8" )。
        System.out.println(コンテキスト)。
    } 
}

パラメータを指定して要求をGET:

@Test
 公共 ボイドtestGetParam(){ 
    CloseableHttpClientクライアント = HttpClients.createDefault()。
    // HTTPGET HTTPGET =新HTTPGET( " https://s.taobao.com/search?q=vivo "); 
    CloseableHttpResponse応答= nullを試す{ 
        URIBuilderビルダー = 新しい URIBuilder( "https://s.taobao.com/search" ); 
        builder.addParameter( "Q"、 "インビボ" )。
        HTTPGET HTTPGET = 新しいHTTPGET(builder.build()); 
        応答 = client.execute(HTTPGET)。
        もし(response.getStatusLine()getStatusCode()== 200 ){ 
            文字列のコンテキスト = EntityUtils.toString(response.getEntity()、 "UTF-8" )。
            System.out.println(コンテキスト)。
        } 
    } キャッチ(例外e){ 
        e.printStackTrace(); 
    } 最後に{
         場合(!応答= ヌル){
             試み{ 
                response.close(); 
            } キャッチ(IOExceptionを電子){ 
                e.printStackTrace(); 
            } 
        } 
        してみてください {
            client.close(); 
        } キャッチ(IOExceptionを電子){ 
            e.printStackTrace(); 
        } 
    } 
}

POSTリクエスト:

@Test
 公共 ボイドtestPost(){ 
    CloseableHttpClientクライアント = HttpClients.createDefault()。
    HttpPost httpPost =  HttpPost( "https://www.cnblogs.com/roadlandscape/" ); 
    CloseableHttpResponse応答 = nullを試す{ 
        応答 = client.execute(httpPost)。
        もし(response.getStatusLine()getStatusCode()== 200 ){ 
            文字列のコンテキスト = EntityUtils.toString(response.getEntity()、 "UTF-8" )。
            System.out.println(コンテキスト)。
        }
    } キャッチ(IOExceptionを電子){ 
        e.printStackTrace(); 
    } 最後に{
         場合(!応答= ヌル){
             試み{ 
                response.close(); 
            } キャッチ(IOExceptionを電子){ 
                e.printStackTrace(); 
            } 
        } 
        試み{ 
            client.close()。
        } キャッチ(IOExceptionを電子){ 
            e.printStackTrace(); 
        } 
    } 
}

パラメータを持つPOSTリクエスト:

@Test
 公共 ボイドtestPostParam(){ 
    CloseableHttpClientクライアント = HttpClients.createDefault()。
    CloseableHttpResponse応答 = nullを試す{ 
        HttpPost httpPost =  HttpPost( "https://s.taobao.com/search" );
        // 创建存放参数的リスト 
        一覧<のNameValuePair>のparams = 新しい ArrayListを<> (); 
        params.add( BasicNameValuePair( "Q"、 "生体内" ));
        // 创建表单数据エンティティ 
        UrlEncodedFormEntityエンティティ= 新しいですUrlEncodedFormEntity(paramsは、 "UTF-8" )。
        // 设置表单エンティティ到httpPost中
        httpPost.setEntity(エンティティ)。
        応答 = client.execute(httpPost)。
        もし(response.getStatusLine()getStatusCode()== 200 ){ 
            文字列のコンテキスト = EntityUtils.toString(response.getEntity()、 "UTF-8" )。
            System.out.println(コンテキスト)。
        } 
    } キャッチ(例外e){ 
        e.printStackTrace(); 
    } 最後に{
         場合(レスポンス!= nullの){
             試み {
                )(response.close。
            } キャッチ(IOExceptionを電子){ 
                e.printStackTrace(); 
            } 
        } 
        試み{ 
            client.close()。
        } キャッチ(IOExceptionを電子){ 
            e.printStackTrace(); 
        } 
    } 
}

接続プーリング:

  各要求は、HttpClientをを作成する必要がある場合、あなたはこの問題を解決するために、接続プーリングを使用することができ、問題が頻繁に作成および破棄があるでしょう。

パブリック クラスConPool {
     公共 静的 ボイドメイン(文字列[]引数)がスローにIOException { 
        PoolingHttpClientConnectionManager CM&LT = 新しい新; PoolingHttpClientConnectionManager()
         // 接続の最大数を設定 
        cm.setMaxTotalを(200で);
         // セット同時各ホストの数 
        cm.setDefaultMaxPerRouteを(20である); 

        のdoGet(CM&LT); 
    } 

    プライベート 静的 ボイドのdoGet(CM&PoolingHttpClientConnectionManager LT)はスローにIOException { 
        CloseableHttpClientクライアント =。HttpClients.custom()setConnectionManager(CM&LT).build(); 
        HTTPGET HTTPGET = 新しい新 HTTPGET( "https://www.cnblogs.com/roadlandscape/" ); 

        // 設定要求パラメータ 
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout( 1000)// 接続を作成するための最大時間を設定 
                .setConnectionRequestTimeoutを(500)// 検索された最大時間を設定は、接続された 
                .setSocketTimeout(10×1000)// 設計データの最大時間は、送信
                (.build)を、
        HTTPGET .setConfig(requestConfig); 

        CloseableHttpResponse応答 = client.execute(HTTPGET)。
        もし(response.getStatusLine()getStatusCode()== 200 ){ 
            文字列のコンテキスト = EntityUtils.toString(response.getEntity()、 "UTF-8" )。
            System.out.println(コンテキスト)。
        } 
    } 
}

 

1.1.1。 コードを記述

 

おすすめ

転載: www.cnblogs.com/roadlandscape/p/12555973.html