2013-10-23 170 views
6

我点击一个按钮后,有一个程序被编写来从网页上抓取源代码。我无法刮取正确的页面,因为我认为正在发送AJAX请求,并且我不等待此响应发生。我的代码是目前:在Htmlunit中处理AJAX请求

public class Htmlunitscraper { 

    private static String s = "http://cpdocket.cp.cuyahogacounty.us/SheriffSearch/results.aspx?q=searchType%3dSaleDate%26searchString%3d10%2f21%2f2013%26foreclosureType%3d%27NONT%27%2c+%27PAR%27%2c+%27COMM%27%2c+%27TXLN%27"; 

    public static String scrapeWebsite() throws IOException { 

    java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF); 
System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); 

    final WebClient webClient = new WebClient(); 
    final HtmlPage page = webClient.getPage(s); 
    final HtmlForm form = page.getForms().get(2); 
    final HtmlSubmitInput button = form.getInputByValue(">"); 
    final HtmlPage page2 = button.click(); 
    String originalHtml = page2.refresh().getWebResponse().getContentAsString(); 
    return originalHtml; 
    } 
} 

参照本link后,我认为解决这个问题,我可以实现方法“webClient.waitForBackgroundJavaScript(10000)”。唯一的问题是我不明白如何做到这一点,因为每次我点击按钮,我创建一个HtmlPage对象,而不是一个WebClient对象。我怎么能结合这种方法来解决这个问题?

回答

2

我想尝试的设置

webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 

的解决方案,这将导致所有Ajax调用是同步的。

或者,您是否尝试在您的解决方案中在tou获得页面后调用“webClient.waitForBackgroundJavaScript(10000)”?

事情是这样的:

final HtmlPage page2 = button.click(); 
webClient.waitForBackgroundJavaScript(10000) 
String originalHtml = page2.asXml(); 
return originalHtml; 

请使用同样的HtmlUnit 2.13

5

对于我来说,帮助可以使用HtmlUnit 2.15与NicelyResynchronizingAjaxController,也

webClient.getOptions().setThrowExceptionOnScriptError(false); 

我的完整安装程序是

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24); 
    webClient.getOptions().setJavaScriptEnabled(true); 
    webClient.getOptions().setThrowExceptionOnScriptError(false); 
    webClient.getOptions().setCssEnabled(false); 
    webClient.setAjaxController(new NicelyResynchronizingAjaxController());