1

Web サイトの複数のページから情報を返すために Htmlunit で作成されたプログラムがあります。問題は、最初の 2 ページは正常に返されますが、1 ページおきに返されることです (ページ 1、2、4、6 などが返されます)。私が参照するすべての変数は正しいと信じているので、問題がプログラムと通信しているサーバーにあるのか、それとも別の問題なのかはわかりません。私のコードは次のとおりです。

  public static void scrapeWebsite() throws IOException {

    final WebClient webClient = new WebClient();
    final HtmlPage page = webClient.getPage(s);
    originalHtml = page.getWebResponse().getContentAsString();
    obtainInformation();
    originalHtml = "";

    //////code below returns page 2 as expected////

    final HtmlForm form = page.getForms().get(0);
    final HtmlSubmitInput button = form.getInputByValue(">");
    final HtmlPage page2 = button.click();
    try {
      synchronized (page2) {
        page2.wait(5000);
      }
    }
    catch(InterruptedException e)
    {
      System.out.println("error");
    }
    originalHtml = originalHtml + page2.refresh().getWebResponse().getContentAsString();
    obtainInformation();
    originalHtml = "";


    /////// code below returns page 4, instead of page 3/////

    final HtmlForm form2 = page2.getForms().get(0);
    final HtmlSubmitInput button2 = form2.getInputByValue(">");
    final HtmlPage page3 = button2.click();
    try {
      synchronized (page3) {
        page3.wait(5000);
      }
    }
    catch(InterruptedException e)
    {
      System.out.println("error");
    }
    originalHtml = originalHtml + page3.refresh().getWebResponse().getContentAsString();
    obtainInformation();
}

私が考えることができる唯一の問題は、 page.refresh() が実行されると、基本的にボタンをダブルクリックしますが、 page.refresh() がないと、最初のページの情報が 3 回返されるだけです。また、s は Web サイトの文字列を指します。

4

1 に答える 1

0

取得しようとしているページを確認しなくても、実際にはコードに奇妙な匂いがするものがいくつかあります。

  1. コードをコピーして貼り付けました。これは正しくありません。コードの追跡が難しくなり、エラーが発生しやすくなります。ページごとにコードを繰り返す必要がないように、必ずコードをモジュール化してください。
  2. originalHtml変数で何をしているのかは明確ではありません。そのメソッドにのみ書き込むのは静的変数のようです。あなたはそこにそれを読んでいないようですので、おそらくobtainInformation()メソッドでそれを読んでいます。その場合、そのメソッドでのみ使用する必要があります。言うまでもなく、値を割り当てて""からページの値を割り当てているため、割り当てが""不要になります。
  3. XML 表現ではなく、HtmlUnit によって返された生の Html を操作する理由がわかりません。に置き換える必要がpage.getWebResponse().getContentAsString()ありpage.asXml()ます。もちろん、ページの生の Html をファイルに保存する必要がある場合は、そのままにしておきます。
  4. そこで実行する理由がわかりませんrefresh()。取得page2して 5 秒間待機します (ページが新しいコンテンツとして動作する準備ができていると盲目的に想定します)。次に、操作する代わりに、page2ページを更新して新しいページのコンテンツを取得します。これが原因で、最初のページが適切に取得され、残りのページが 2 間隔で表示される可能性があります。

これらは、役立つはずの一般的なコメントです。必ずしも問題が修正されるわけではありませんが、コードが大幅に改善されるはずです。

于 2013-10-29T21:04:28.730 に答える