我想抓取使用GWT构建的网页,并使用GWT RPC机制进行AJAX调用。我正在尝试抓取的页面不是我的 - 所以我无法编辑服务器端。我对GWT非常陌生,从最初的几天开始,我认为除非你有与你的案例界面,否则你不能反序列化数据。网页抓取/抓取基于GWT的网页
我是对的还是有一种方法可以智能地抓取数据?
我想抓取使用GWT构建的网页,并使用GWT RPC机制进行AJAX调用。我正在尝试抓取的页面不是我的 - 所以我无法编辑服务器端。我对GWT非常陌生,从最初的几天开始,我认为除非你有与你的案例界面,否则你不能反序列化数据。网页抓取/抓取基于GWT的网页
我是对的还是有一种方法可以智能地抓取数据?
你可以通过和的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());
我以谋生为生,GWT是一个几乎总是让我烦躁的框架。事实上,它通过序列化,非人类可读的参数阻止我的插件逻辑,将访问该网站。
在一些简单的GWT上,我已经得到了解决办法,正在解析JavaScript和运行部分,但我无法让所有人都工作。
可能是由设计。 –
我能够使用htmlunit来做到这一点 - 强制要在执行DOM之前执行java脚本。 – gokul