httpclient の使用と htmlcleaner の簡単な使用

今日私はこう言いました:httpclient、彼はApacheの下にあり、現在それを使用して同期Webサイトを収集しています、

したがって、まず第一に、このコードを見る前に、リクエストの応答を理解しておく必要があります。そうすることで、よりよく理解できるようになります。httpclient は、ネットワーク プログラミングのカプセル化です。つまり、ネット パッケージの下にあります。これは、URLConnection クラスでも収集できるためです。いろいろありますが、結局はネイティブなので、コードが少なくなるように、最初にメインに例外をスローします

しばらくしてからの紹介は何ですか、先生に関するpptとビデオがあります

 

しばらくして、必要な jar パッケージを Baidu ネットワーク ディスクに置きます。もちろん、Maven の依存関係を追加することもできます。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
</dependency>

 

 

//@Test
    public void fun() throws Exception{         CloseableHttpClient httpClient = HttpClients.createDefault(); //インスタンス オブジェクトを作成         HttpGet httpGet = new HttpGet("https://www.tinaya.com/"); //内部だけリンクに必要なアドレスを入力します         httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/68.0.3440.84 Safari/537.36"); //なぜここにリクエストヘッダーが設定されているのでしょうか?


一部の Web サイトにはクローラー対策が施されているため、この設定は人間の操作をシミュレートするためのものです。そうしないと、IP アドレスがブロックされる可能性があります。

/*
         レスポンスを取得したら、レスポンスを分析する必要があります
         */
        CloseableHttpResponse response = httpClient.execute(httpGet); ///http プロトコルの get リクエストを実行します
        HttpEntity entity = response.getEntity(); //エンティティを取得します
        System.out.println("Web ページのソース コードは次のとおりです:");
        String src = EntityUtils.toString(entity, "utf-8"); //ソース コードをどのような形式で見るか?? 一般Web ページのメタ タグには content-type が含まれており、リクエスト ヘッダーはその
        System.out.println(src);
        //close
        response.close();
        httpClient.close();
    }

/*
     なぜコンテンツ タイプを取得する必要があるのですか?
    
     特定の MIME タイプによると、
    
     なぜステータス コードを取得する必要がありますか?
     200 は成功を意味し、404 は見つからないことを意味するため、
     200 でない場合は、次のクローラがコードを実行する必要はありません
     */

//このページの MIME タイプを取得します
        String value =entity.getContentType().getValue();
        System.out.println(value); //content-type の値を出力します
        
        //このページのステータス コードを取得します
        StatusLine line = response .getStatusLine();
        System.out.println(line);//HTTP/1.1 200 OK これはその情報を返すためのものです
        //しかし、通常はステータス コードのみが必要なので、それを判断に使用します
        int code =行 .getStatusCode();
        System.out.println(code);

 

 

2 HttpClient が写真をキャプチャします。

public void fun() throws Exception{         CloseableHttpClient httpClient = HttpClients.createDefault();         HttpGet httpGet = new HttpGet("http://xxxx/gg/sxt2.gif"); // 画像アドレスを変更するだけです         httpGet.setHeader (" User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/68.0.3440.84 Safari/537.36"); CloseableHttpResponse 応答 = httpClient.execute(httpGet); HttpEntity エンティティ         =         応答.getEntity();         if(entity!=null){             System.out.println(entity.getContentType().getValue());             InputStream input =entity.getContent();//ストリームの形式 (写真はバイトであり、もちろんストリームとして送信および書き込まれます)








            FileUtils.copyInputStreamToFile(input, new File("C:\\sxt.gif"));//ほら、ファイルを保存するときにファイルのサフィックスを知るにはどうすればよいですか。ファイルに String imageHref 変数を書き込むことができます。 、渡した画像のパスがわかっており、そのパスに名前があるので、それをインターセプトするだけです

このメソッドは Commons.io パッケージ内の単なるメソッドです
      
        }

 

 

プロキシIPを設定する

Web ページをクロールする場合、一部の対象サイトにはクローラー対策の仕組みがあり、頻繁なサイト訪問や定期的なサイト訪問に対して IP ブロック対策が収集されます。

 

このとき、プロキシ IP が役に立ちます。

 

プロキシIPに関しても、透過プロキシ、匿名プロキシ、紛らわしいプロキシ、高匿名性プロキシなどの種類があります。

透過的プロキシ: 透過的プロキシはあなたの IP アドレスを直接「隠す」ことができますが、それでもあなたが誰であるかを知ることができます。

匿名プロキシは透過プロキシよりも少し優れています。他の人はあなたがプロキシを使用していることだけを知ることができますが、あなたが誰であるかを知ることはできません。

プロキシを混乱させるため、他の人はあなたがプロキシを使用していることを知ることができますが、偽の IP アドレスを取得することになります。これは偽装としてより現実的です。

匿名性の高いエージェントなので、エージェントを利用していることが他人に分からないので最適です。私たちは注目度の高いプロキシを使用しています。

 

プロキシ IP はどこから来たのでしょうか? それは非常に簡単です、Baidu など、多くのプロキシ IP サイトをご存知でしょう。通常は一部無料

 

     CloseableHttpClient httpClient=HttpClients.createDefault(); // httpClient インスタンスを作成します

        HttpGet httpGet=new HttpGet("https://www.taobao.com/"); // httpget インスタンスを作成

        HttpHost proxy=new HttpHost("116.226.217.54", 9999); //プロキシ IP の設定に使用されます

/*

       このクラスは org.apache.http.client.config パッケージの下にあり、主に外部ネットワーク環境の取得と構成に使用されます。その下にネストされたクラス RequestConfig.Builder があります。

使用方法は、まずRequestConfigクラスの静的メソッドcustom()を使用してrequestConfig.Builder「コンフィギュレータ」を取得し、次に以下のさまざまなメソッドを使用してネットワーク環境を構成します。

 

*/

        RequestConfig requestConfig=RequestConfig.custom().setProxy(プロキシ).build();

        httpGet.setConfig(requestConfig);

        httpGet.setHeader("ユーザー エージェント", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");

        CloseableHttpResponse response=httpClient.execute(httpGet); // http get リクエストを実行します

        HttpEntityentity=response.getEntity(); // 返されたエンティティを取得します

        System.out.println("Webpage content: "+EntityUtils.toString(entity, "utf-8")); // Webページのコンテンツを取得します

        response.close(); // レスポンスを閉じる

        httpClient.close(); // httpClient が閉じられています

 

 

  一般に、コレクション Web サイトで 403 に遭遇した場合、ブロックされる可能性があります。このとき、プロキシ IP を変更する必要があります。アイデア: 最初に小さな
     クローラー
     を作成し、これらの無料のプロキシ IP Web サイトにアクセスし、IP とポートを取得します
     。プロキシ IP とポートを2 つのデータのマップ (キュー内) に追加します。
     判定を追加することもできます。403 の場合は、次のマップのキーと値のペアを取り出して ip を削除すると、
     常にさらに、別の判断を追加し、IP が十分でない場合は、クローラーを実行し続けて IP をクロールします。

 

httpClient には、特定の http リクエストを実行するときに接続時間とコンテンツを読み取る時間があります。

 

いわゆる接続時間は、HttpClient がターゲット URL のホスト アドレスにリクエストを送信してからの時間です。

回線はよりスムーズで高速になりますが、複雑に絡み合ったルーティングのため、接続時間が一定しないことが多く、運が悪いと接続できなくなることがあります。

デフォルトは 1 分です。1 分を超えて接続を試み続けると問題が発生します。常に接続できない URL に遭遇すると、他のスレッドの入力に影響を与えるため、設定など特別な設定が必要です。10秒以内に接続がなかった場合はエラーとして報告し、業務処理を行うことができます。

たとえば、ビジネスを制御した後、再度接続を試みます。そして、この特別な URL は log4j ログに書き込まれます。管理者が閲覧するのに便利です。

ttpClientの読み取り時間

いわゆる読み取り時間は、HttpClient がターゲット サーバーに接続してからコンテンツ データを取得するまでの時間であり、一般的にデータの読み取りは非常に高速です。

ただし、読み取るデータの量が多い場合、またはターゲット サーバー自体に問題がある場合 (データベースの読み取りが遅い、大量の同時実行など)、読み取り時間にも影響します。

上記のように、10秒に設定するなど、10秒以内に読み取りが完了しない場合はエラーが報告されるなど、特殊な設定が必要な場合もありますが、業務上は対応可能です。

 

   接続がタイムアウトした場合、レポートは接続タイムアウトになり、
   読み取りがタイムアウトした場合、レポートの読み取りはタイムアウトになります。

 

CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet("https://www.tuicool.com/");
        
        
        RequestConfig config = RequestConfig.custom()
                            .setConnectTimeout(10000)//接続
                            タイムアウトを設定します.setSocketTimeout ( 10000)//Set read timeout.build
                            ();
        httpGet.setConfig(config);
        httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Gecko のような KHTML) Chrome /68.0.3440.84 Safari/537.36");
        CloseableHttpResponse response = httpClient.execute(httpGet);
        HttpEntityentity = response.getEntity();
        System.out.println("Web ページのソース コードは次のとおりです:");
        文字列 src = EntityUtils.toString(entity, "utf-8");
        System.out.println(src);
        //关流
        response.close();
        httpClient.close();

 

/================================================ ====

実際、httpclient は多くのことを実行できますが、現時点で httpclient でできることは限られており、httpclient よりも優れた機能を備えたものは他にもあります。

後でわかります

ソース コードを解析した後はどうですか? コンテンツを解析できますか? もちろんです。

しかし、考慮したことがありますか? 一部の Web サイトのフロントデスク担当者のコードは適切に記述されていないため、タグをペアまたは短いタグで表示できない状況が発生する可能性があります。

これは htmlcleaner または htmlparser のデビューです

個人的には htmlcleaner を使用することをお勧めします。

HtmlCleaner clean = new HtmlCleaner();
        TagNode tagNode = clean.clean(src); //これが仕組みです

 

xpath をサポートしており、それを使用してコンテンツを解析できます

//タイトル
           Object[] タイトル = tagNode.evaluateXPath("xpath 式");

 

あとは入手するだけです

 

htmlcleaner はソース コードを dom ツリーに変換することもでき、dom4j を使用してそれを解析することもできますが、xpath が付属しているため、まだ少し面倒です。なぜわざわざ新しい xpathFacotry を作成するのでしょうか?
-------- ---- ---------
 

おすすめ

転載: blog.csdn.net/qq_40077806/article/details/83591911