1

我有一个用 Htmlunit 编写的程序,可以从网站上的多个页面返回信息。问题是,虽然前两页返回正常,但随后每隔一页返回(返回第 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 指的是网站的字符串。

4

1 回答 1

0

如果不查看您尝试获取的页面,您的代码中有些东西实际上闻起来很奇怪。

  1. 您有复制/粘贴的代码。这是不正确的,导致难以遵循代码并且很容易出错。确保你模块化你的代码,这样你就不必为每一页重复它。
  2. 目前尚不清楚您对originalHtml变量做了什么。似乎它是一个静态变量,您只能在该方法中编写。您似乎没有在其中阅读它,因此您可能在该obtainInformation()方法中阅读它,在这种情况下,它应该仅在该方法中使用。更不用说你给它分配了价值"",然后是页面的价值,这使得分配变得""不必要。
  3. 我看不出有任何理由对 HtmlUnit 返回的原始 Html 而不是其 XML 表示进行操作。您应该替换page.getWebResponse().getContentAsString()page.asXml(). 当然,如果您确实需要将页面的原始 Html 保存到文件中,请保持原样。
  4. 我看不出有任何理由在refresh()那里表演。你得到page2并等待5秒钟(一味地假设页面作为新内容准备好对其进行操作)。然后,您无需对其进行操作,而是page2刷新它并获取新页面的内容。这可能是您正确获取第一页而其余页面间隔 2 的原因。

这些只是一些应该对您有所帮助的一般性评论。他们不一定会解决问题,但应该会大大改进您的代码。

于 2013-10-29T21:04:28.730 回答