JavaScriptを使用したJavaコードのデバッグ


現代のブラウザーのために構築されたウェブサイトを掻くことは、それが10年前よりはるかにチャレンジングです.jSmokeは、DOM横断、CSSセレクタ、JQueryのような方法とより多くを通してウェブサイトを摩滅させる便利なAPIです.しかし、それはその警告なしでありません.すべてのスクレーピングAPIは刻々とした時間の爆弾です.
現実世界のHTMLはフレークです.文書化されたAPIではないので、予告なしに変更されます.我々のJavaプログラムが掻くことに失敗するとき、我々は突然刻々とした時限爆弾で立ち往生します.場合によっては、これはローカルで展開し、展開できる簡単な問題です.しかし、DOMツリーの微妙な変更は、ローカルテストケースで観測するのが難しいかもしれません.これらの場合、更新を押す前に解析木の問題を理解する必要があります.さもなければ、我々は生産で壊れた製品を持っているかもしれません.

JSeatとはJava HTMLパーサー


JSookieのデバッグのナットとボルトに入る前に、最初の答えは、上記の質問とJSinkの背後にあるコアの概念を議論する.
The jsoup website 以下のように定義します:
jSinkは現実世界のHTMLで動作するJavaライブラリです.これは、URLをフェッチし、データを抽出し、操作するための非常に便利なAPIを提供し、HTML 5 DOMメソッドとCSSセレクタのベストを使用して.
JSpecは、WHATWG HTML5 現代のブラウザと同じDOMにHTMLを指定し、解析します.
それを念頭に置いて、同じウェブサイトからも簡単にサンプルに行きましょう.
Document doc = Jsoup.connect("https://en.wikipedia.org/").get();
log(doc.title());
Elements newsHeadlines = doc.select("#mp-itn b a");
for (Element headline : newsHeadlines) {
  log("%s\n\t%s",
    headline.attr("title"), headline.absUrl("href"));
}
このコードスニペットはWikipediaから見出しを取ります.上のコードでは、いくつかの興味深い機能があります.
  • URLへの接続は実質的にシームレスです
  • いくつかの要素の子に特別なケースがあります.たとえば、DOMツリーから選択せずに文字列を返す単純なメソッドとして
  • しかし、我々は非常に複雑なセレクタ構文を使用してエントリを選択することができます
  • あなたがそれを見ているならば、「それは壊れやすいように思えます」.はい.

    簡単なJSeatテスト


    デバッグを行うには、ここでダウンロードできる簡単なデモを作成しました.
    次のMaven依存関係を使用して、JSookieをJavaプログラムにインストールできます.MavenはJSave jarをシームレスにダウンロードします.
    <dependency>
      <groupId>org.jsoup</groupId>
      <artifactId>jsoup</artifactId>
      <version>1.14.3</version>
    </dependency>
    
    このデモは、ページ内のsrc属性を持つ外部リンクと要素の完全なリストを返す些細なJavaアプリケーションです.これはここからのコードに基づいています.JSpec適用コードは比較的短いです.
    public Set<String> listLinks(String url, boolean includeMedia) throws IOException {
       Document doc = Jsoup.connect(url).get();
       Elements links = doc.select("a[href]");
       Elements imports = doc.select("link[href]");
    
       Set<String> result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
       if(includeMedia) {
           Elements media = doc.select("[src]");
           for (Element src : media) {
               result.add(src.absUrl("src"));
               //result.add(src.attr("abs:src"));
           }
       }
    
       for (Element link : imports) {
           result.add(link.absUrl("abs:href"));
       }
    
       for (Element link : links) {
           result.add(link.absUrl("abs:href"));
       }
    
       return result;
    }
    
    ご覧の通り、入力文字列URLを取得します.また、入力ストリームを使用することもできますが、これは相対的なURLを解析する際に少し複雑になります.次に、src属性を持つリンクとオブジェクトを検索します.その後、コードをソートし、一意のエントリを維持するためにセットにそれらのすべてを追加します.
    これを次のコードを使用してWebサービスとして公開します.
    @RestController
    public class ParseLinksWS {
       private final ParseLinks parseLinks;
    
       public ParseLinksWS(ParseLinks parseLinks) {
           this.parseLinks = parseLinks;
       }
    
       @GetMapping("/parseLinks")
       public Set<String> listLinks(@RequestParam String url, @RequestParam(required = false) Boolean includeMedia) throws IOException {
           return parseLinks.listLinks(url, includeMedia == null ? true : includeMedia);
       }
    }
    
    アプリケーションを実行すると、単純なcurlコマンドで使用できます.
    curl -H "Content-Type: application/json" "http://localhost:8080/parseLinks?url=https%3A%2F%2Flightrun.com"
    
    これはLightRunホームページで参照されるURLのリストを出力します.

    デバッグ失敗


    典型的な文字列のスクレーピング問題は、要素オブジェクトが変更されたときに発生します.例えば、Wikipediaはページの構造を変更することができます.これはしばしば、選択されたメソッドの失敗を引き起こす可能性があるJavaオブジェクト階層のDOM要素を欠落させる、微妙な失敗です.
    残念ながら、これは微妙な失敗かもしれません.特に入れ子になったノード要素とドキュメント間の依存関係を扱うとき.ほとんどの開発者は大量のデータを記録することでこれを解決します.これは2つの大きな理由から問題があります.
  • 巨大なログ-彼らは両方を読むのは難しいと非常に高価なingest
  • プライバシー/GDPR違反-スクラップされたサイトは、ユーザー固有の個人情報を含むかもしれません.悪い!
  • 掻き取られたサイトは、最初にスクレーピングが実施された後に個人情報を含むように変更されるかもしれません.このプライベート情報をログ出力すると、さまざまな法律に違反する可能性があります.
  • 我々が十分にログを出さないならば、ローカルで問題を再現することができないならば、ものは難しくなることができます.我々は、追加ログ、ビルド、テスト、展開、再生-リンス繰り返しループでスタックしている.
    LightRunはより良い方法を提供しています.ただ、生産に直接の特定の障害を追跡し、問題を確認し、1つの展開で動作する修正プログラムを作成します.
    注意:このチュートリアルでは、LightRunをインストールし、その背後にある基本的な概念を理解しています.そうでないならcheck out the docs .

    ブラウザであなたの方法を見つける


    あなたがどこでどこを見てよいかわからないと仮定して、スタートする良い場所はJSexp APIの中にあります.これはユーザーコードに戻ることができます.クールなことは、このコードに関係なく動作します.APIコールを掘ることによって、スナップショットの正しい行/ファイルを見つけることができます.
    ここでselectメソッドの呼び出しをクリックしました.
    Elements links = doc.select("a[href]");
    
    そして、それは私を要素クラスに導きました.私はCtrlキーをクリックして“選択”メソッドを選択し、“興味深い”場所になった.
    ここで、私は「A [ HRef ]」質問があるあらゆるケースを見るために条件つきスナップショットを置くことができました:

    これにより、クエリを実行するメソッド/行が表示されます.

    これはドキュメントオブジェクト階層の一般的な問題領域を狭めることに大いに役立ちます.
    時々、スナップショットは十分でないかもしれません.ログを使う必要があるかもしれません.ロギングの利点は、我々は多くの情報を生産することができますが、特定のケースとオンデマンドだけです.
    ログの値は、コードを踏むことに非常に似ている方法で問題に従うことができます.スナップショットを置くポイントはログに問題があります.送信された問い合わせを知っていますが、まだ返される値はありません.我々は、ログで簡単にこれを解決することができます.まず、ログを次のテキストで追加します.
    "Executing query {query}"
    

    それから、どのように多くのエントリを返したかを知るために、呼び出し元に行ってください(スナップショットのスタックに感謝しています).
    Links query returned {links.size()}
    

    これは、我々が147を持っていたのを見る次のログを生産しますa[href] リンク.これの美しさは、追加のログが文脈における既存のログとインターレースされることです.
    Feb 02, 2022 11:25:27 AM org.jsoup.select.Selector select
    INFO: LOGPOINT: Executing query a[href]
    Feb 02, 2022 11:25:27 AM com.lightrun.demo.jsoupdemo.service.ParseLinks listLinks
    INFO: LOGPOINT: Links query returned 147
    Feb 02, 2022 11:25:27 AM org.jsoup.select.Selector select
    INFO: LOGPOINT: Executing query link[href]
    Feb 02, 2022 11:25:27 AM org.jsoup.select.Selector select
    INFO: LOGPOINT: Executing query [src]
    

    セキュリティとGDPR問題を避ける


    GDPRとセキュリティ問題は、ログにユーザー情報を漏らす問題です.これは大きな問題であり、LightRunは大幅にそのリスクを減らすことができます.
    LightRunはタンデムで使用することができる2つの潜在的なソリューションを提供しています.

    ログパイピング


    GDPRの大きな問題はログ摂取です.プライベートユーザーデータをログオンし、クラウドに送ると長い間そこにあります.それは事実の後に見つけるのは難しいです、それは修正するのは非常に難しいです.
    LightRunは、すべてのLightRunの注入されたログを直接IDEにログ出力する機能を提供します.これは、ログで動作する可能性のある他の開発者からのノイズを除去する利点があります.また、摂取をスキップすることができます.
    ログのみをプラグインに送信するには、「プラグイン」としてパイピングモードを選択します.

    PII削減/ブロックリスト


    個人的に識別可能な情報(PPI)は、GDPRのコアにあり、また、主要なセキュリティリスクです.あなたの組織の悪意のある開発者は、Simphonユーザー情報にLightRunを使いたいかもしれません.ブロックリストは、開発者が特定のファイルにアクションを配置するのを防ぎます.
    PIIの削減は、ログからの特定のパターンに一致する情報を隠すことができます.これは、管理者ロールによってlightrunウェブインターフェイスで定義することができます.

    TLドクター


    Javaコンテンツのこじつけで、JSookieは明らかなリーダーです.jShapeを使用した開発は、文字列操作よりもはるかに多くなります.ドキュメントオブジェクトを取得する他に、DOM要素とスクリプトに必要な複雑な側面も扱います.
    掻き取りは危険なビジネスです.ウェブサイトがわずかに変わると目の瞬きで壊れるかもしれません.
    さらに悪いことに、ローカルで再生することができない奇妙な方法で一部のユーザーに壊れることができます.
    LightRunのおかげで、生産環境で直接そのような失敗をデバッグし、迅速に作業版を公開できます.あなたがサインアップして無料でLightRunを使用することができますhere .