我有一个用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指的是网站的字符串。
答案 0 :(得分:0)
如果不查看您尝试获取的页面,有些内容在您的代码中实际上有些奇怪。
originalHtml
变量做了什么。它似乎是一个静态变量,你只能在该方法中编写。你似乎没有在那里阅读它,所以你可能在obtainInformation()
方法中阅读它,在这种情况下它应该只在该方法中使用。更不用说你要为它赋值""
,然后是不需要""
赋值的页面值。page.getWebResponse().getContentAsString()
替换为page.asXml()
。当然,如果你真的需要将页面的原始Html保存到文件中,那么保持原样。refresh()
。你得到page2
并等待5秒钟(盲目地假设该页面作为准备在其上运行的新内容)。然后,不是在page2
上操作,而是刷新它并获取新页面的内容。这可能是您正确获取第一页并且其余部分间隔为2的原因。这些只是一些可以帮助你的一般性评论。它们不一定能解决问题,但应该大大改善您的代码。