2011-12-05 165 views
1

我想抓取使用GWT构建的网页,并使用GWT RPC机制进行AJAX调用。我正在尝试抓取的页面不是我的 - 所以我无法编辑服务器端。我对GWT非常陌生,从最初的几天开始,我认为除非你有与你的案例界面,否则你不能反序列化数据。网页抓取/抓取基于GWT的网页

我是对的还是有一种方法可以智能地抓取数据?

+1

我能够使用htmlunit来做到这一点 - 强制要在执行DOM之前执行java脚本。 – gokul

回答

1

你可以通过和的HtmlUnit做的WebClient它:

//real code mixed with pseudo-code: 
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3); 
Map<String, String> urls = new HashMap<->(); 
LinkedList<String> urlsToVisit = new LinkedList<->(); 
urlsToVisit.put("http://some_gwt_app.com/#!home"); 
while (!urlsToVisit.isEmpty()) { 
    String page = urlsToVisit.remove(); 
    if (urls.containsKey(page)) { 
     continue; 
    } 
    String rendered = webClient.getPage(page); 
    urls.put(page, rendered); 
    urlsToVisit.addAll(extractLinks(page)); 
} 

你可能有WebClient的选项来实验一下。在我的情况下,这些似乎做得很好:

webClient.setThrowExceptionOnScriptError(false); 
webClient.setRedirectEnabled(true); 
webClient.setJavaScriptEnabled(true); 
// important! Give the headless browser enough time to execute 
// JavaScript. The exact time to wait may depend on your application. 
webClient.waitForBackgroundJavaScript(20000); 
webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 
+0

你如何建议extractLinks被实现? – wytten

+0

@wytten这是另一个问题(HTML解析):) – milan

+0

我特别感兴趣的是在这种情况下构成一个链接:“一个”,“链接”,“脚本”,其他标签? – wytten

0

我以谋生为生,GWT是一个几乎总是让我烦躁的框架。事实上,它通过序列化,非人类可读的参数阻止我的插件逻辑,将访问该网站。

在一些简单的GWT上,我已经得到了解决办法,正在解析JavaScript和运行部分,但我无法让所有人都工作。

+0

可能是由设计。 –