在(任何)Java程序中呈现JavaScript和HTML(访问呈现的DOM树)?
什么是最好的Java库“完全下载任何网页并呈现内置JavaScript,然后以编程方式访问呈现的网页(即DOM树!),并将DOM树作为“HTML源” (与firebug最终所做的类似,它呈现页面,我可以访问完全呈现的DOM树,就像浏览器中的页面一样!相反,如果我单击“显示源代码”,我只能获得JavaScript源代码。这不是我想要的。我需要访问呈现页面…) (对于渲染,我的意思是只渲染DOM树而不是视觉渲染…) 这不一定是一个单一的库,可以有几个库一起完成(一个将下载,一个呈现…),但由于JavaScript的动态特性,JavaScript库很可能还必须有某种下载程序来完全呈现任何异步JS 背景:在(任何)Java程序中呈现JavaScript和HTML(访问呈现的DOM树)?,java,javascript,rendering,Java,Javascript,Rendering,什么是最好的Java库“完全下载任何网页并呈现内置JavaScript,然后以编程方式访问呈现的网页(即DOM树!),并将DOM树作为“HTML源” (与firebug最终所做的类似,它呈现页面,我可以访问完全呈现的DOM树,就像浏览器中的页面一样!相反,如果我单击“显示源代码”,我只能获得JavaScript源代码。这不是我想要的。我需要访问呈现页面…) (对于渲染,我的意思是只渲染DOM树而不是视觉渲染…) 这不一定是一个单一的库,可以有几个库一起完成(一个将下载,一个呈现…),但由于Jav
在“美好的过去”,HttpClient(Apache库)是构建您自己的非常简单的爬虫程序所需的一切。(许多Cralwer,如Nutch或Heretrix,仍然围绕这个核心原则构建,主要关注标准HTML解析,因此我无法从中学习) 我的问题是,我需要抓取一些严重依赖JavaScript的网站,而我无法使用HttpClient解析这些网站,因为我需要在MozSwing提供帮助之前执行JavaScripts。您可以试试JExplorer。 有关更多信息,请参阅
您也可以尝试Cobra,请参见这有点不合时宜,但如果您计划在完全控制环境的服务器上运行代码,它可能会起作用 在你的机器上安装Firefox(或者XulRunner,如果你想保持轻量级的话) 使用Firefox插件系统,编写一个小插件,加载给定的URL,等待几秒钟,然后将页面的DOM复制到字符串中 在这个插件中,使用JavaLiveConnect API(请参阅和)将该字符串推送到某个嵌入Java代码中的公共静态函数中,该函数可以自己执行所需的处理,也可以将其分配到更复杂的代码中 优点:您使用的浏览器是大多数应用程序开发人员的目标浏览器,因此观察到的行为应具有可比性。您还可以按照正常的升级路径升级浏览器,这样您的库不会随着HTML标准的更改而过时 缺点:您需要有在服务器上启动无头应用程序的权限。您还需要担心进程间通信的复杂性 我以前使用过插件API调用Java,这是可以实现的。如果你想要一些示例代码,你应该看看XQuery插件-它从DOM加载XQuery代码,将其传递到Java Saxon库进行处理,然后将结果推回到浏览器中。这里有一些详细信息: 该库通常用于测试,但它确实为您提供了对大多数标准浏览器(如Firefox等)的远程控制,以及无头、无浏览器模式(使用HtmlUnit)。因为它旨在通过页面抓取进行UI验证,所以它很可能满足您的目的 根据我的经验,它有时会遇到速度非常慢的JavaScript,但仔细使用“wait”命令可以得到非常可靠的结果 它还有一个好处,即您可以实际驱动页面,而不仅仅是刮取页面。这意味着,如果您在获取所需数据之前在页面上执行某些操作(单击搜索按钮,单击下一步,现在刮取),那么您可以将其编码到流程中
我不知道您是否能够从Selenium以可导航的形式获得完整的DOM,但它确实为页面的各个部分提供了XPath检索,这是刮片应用程序通常需要的。您可以使用Java、Groovy和Grails,也可以不使用Grails。然后使用Webdriver、Selenium、Spock和Geb这些都是用于测试purpos的是的,但是这些库对您的案例很有用。 您可以实现一个爬虫程序,它不会打开一个新窗口,而只是这些浏览器的一个运行时
- 硒:
- 网络驱动程序:
- 斯波克:
- Geb:
您可以使用JavaFX2
WebEngine
。下载(如果您安装了JDK7u2或更高版本,您可能已经拥有了它),然后尝试下面的代码
它将使用经过处理的javascript打印html。
可以在中间取消注释行,也可以看到呈现。
public class WebLauncher extends Application {
@Override
public void start(Stage stage) {
final WebView webView = new WebView();
final WebEngine webEngine = webView.getEngine();
webEngine.load("http://stackoverflow.com");
//stage.setScene(new Scene(webView));
//stage.show();
webEngine.getLoadWorker().workDoneProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
if (newValue.intValue() == 100 /*percents*/) {
try {
org.w3c.dom.Document doc = webEngine.getDocument();
new XMLSerializer(System.out, new OutputFormat(doc, "UTF-8", true)).serialize(doc);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
}
public static void main(String[] args) {
launch();
}
}
公共类WebLauncher扩展应用程序{
@凌驾
公众假期开始(阶段){
最终WebView WebView=新WebView();
final-WebEngine-WebEngine=webView.getEngine();
webEngine.load(“http://stackoverflow.com");
//舞台场景(新场景(网络视图));
//stage.show();
webEngine.getLoadWorker().workDoneProperty().addListener(新的ChangeListener()){
@凌驾
public void changed(observevalue)当您说“呈现任何异步js”时,您的意思是库需要具有“刮取”功能吗"页面进行的任何异步调用?这将非常困难,因为您基本上是在尝试捕获动态页面的内容,该页面在初始请求完成后更新,有时在用户触发事件之前,数据不会异步拉入。+1-这方面的解决方案已经启动过一次,但不幸的是,开发在2008年停滞了,很明显-enter:它的目的是允许运行针对DOM的javascript scraper来自动化网站抓取,但避免了所有语法规范化问题。-即使是a,但Ben的结论和更新是高的