4

ここで深刻な懸念があります。スタックオーバーフローや他の多くのサイトをすべて検索しました。彼らが同じ解決策を提供するすべての場所で、私はそれらすべてを試しましたが、私はこの問題を解決できません。

私は次のコードを持っています、

Document doc = Jsoup.connect(url).timeout(30000).get();

ここでは Jsoup ライブラリを使用しており、得られる結果は実際のページ ソースと同じではありませんが、ページを右クリックして -> ページ ソースを表示します。上記のコード行で取得した結果には、多くの部分が欠けています。Googleでいくつかのサイトを検索した後、私はこの方法を見ました、

URL url = new URL(webPage);
        URLConnection urlConnection = url.openConnection();
        urlConnection.setConnectTimeout(10000);
        urlConnection.setReadTimeout(10000);
        InputStream is = urlConnection.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);



        int numCharsRead;
        char[] charArray = new char[1024];
        StringBuffer sb = new StringBuffer();
        while ((numCharsRead = isr.read(charArray)) > 0) {
            sb.append(charArray, 0, numCharsRead);
        }
        String result = sb.toString();          

        System.out.println(result);   

しかし運がない。この問題をインターネットで検索しているときに、Web ページのページ ソースをダウンロードするときに、Web ページの適切な charSet とエンコーディング タイプを設定する必要があると述べている多くのサイトを見ました。しかし、コードからこれらのことを動的に知るにはどうすればよいですか?? そのためのJavaのクラスはありますか。私もクローラー4jを少し試しましたが、あまり効果がありませんでした。みんな助けてください。m は、この問題に 1 か月以上悩まされています。私はできる限りの方法を試しました。最後の希望はいつも助けてくれたスタックオーバーフローの神々です!!

4

3 に答える 3

3

問題は、Web ページがブラウザーで実行される Javascript によってレンダリングされることである可能性があります。JSoup だけではこれを解決できないため、Selenium を使用してブラウザーをエミュレートする HtmlUnit を使用してみてください: Jsoup を使用してサインインおよびクロールするデータ

アップデート

HTML が異なる理由はいくつかあります。最も可能性が高いのは、この Web ページ<javascript>に動的なページ ロジックを含む要素が含まれていることです。これは、リクエストをサーバーに送信し、レスポンスに応じてコンテンツを追加または削除する Web ページ内のアプリケーションである可能性があります。

JSoup がそのようなページをレンダリングすることは決してありません。これは、Chrome、Firefox、または IE などのブラウザーのジョブであるためです。JSoup は、サーバーから取得するプレーンテキスト html 用の軽量パーサーです。

したがって、Web ブラウザーをエミュレートしてメモリ内のページをレンダリングする Web ドライバーを使用できるため、ユーザーに表示されるのと同じコンテンツを持つことができます。このドライバでマウス クリックを行うこともできます。

また、リンクされた回答で提案されている Web ドライバーの実装は HtmlUnit です。これは最も軽量なソリューションですが、予期しない結果が生じる可能性があります: Selenium v​​s HtmlUnit? .

最もリアルなページ レンダリングが必要な場合は、Selenium WebDriverを検討することをお勧めします。

于 2013-11-13T18:55:12.997 に答える
1

なぜこのように Web ページを解析したいのですか? Web サイトから利用可能な消耗品サービスがある場合、その Web サイトにはREST APIがある可能性があります。

あなたの質問に答えるために、同じ Web ページがURLConnectionを使用してダウンロードされるため、Web ブラウザーを使用して表示される Web ページは同じでない可能性があります。

以下は、これらの違いを引き起こす理由のいくつかである可能性があります。

  1. リクエスト ヘッダー: クライアント (Java アプリケーション/ブラウザ) が URL のリクエストを行うと、リクエストの一部としてさまざまなヘッダーが設定され、それに応じて Web サーバーがレスポンスの内容を変更する場合があります。

  2. Java Script : 応答が受信されると、応答に Java スクリプト要素が存在する場合、ブラウザーの JavaScript エンジンによって実行され、DOMの内容が変更される可能性があります。

  3. IE ブラウザー ヘルパー オブジェクト、Firefox 拡張機能、Chrome 拡張機能などのブラウザー プラグインは、DOM の内容を変更する場合があります。

簡単に言えば、URLConnection を使用して URL をリクエストすると生データを受け取りますが、ブラウザのアドレスバーを使用して同じ URL をリクエストすると、(javascript/ブラウザ プラグインによって) Web ページが処理されます。

URLConnection /JSoup を使用すると、必要に応じてリクエスト ヘッダーを設定できますが、ポイント 2 と 3 のために異なる応答が得られる場合があります。Selenium は、Web アプリケーションの自動テストに使用されます。

于 2013-11-13T20:25:59.153 に答える