我可以把HTMLUnit配置为仅运行特定的JavaScript进程而不是整个流程吗?

6
我想要从一组格式非常相似的网页中收集信息。我需要获取打开页面后由Javascript加载的一些信息。看起来HTMLUnit是一个很常见的工具,可以做到这一点,所以我正在使用它。不幸的是,它非常慢,这是我在许多论坛上看到的抱怨。webClient.getPage()命令是耗时最长的。当我关闭Javascript时,它运行得很快,但我需要执行一些Javascript命令。我想知道,是否有一种方法可以有选择地执行一些Javascript命令而不是全部执行?
或者,有没有比HTMLUnit处理Javascript更快的程序?
1个回答

4

有点像。您可以编程决定加载哪些外部JavaScript URL:

如果启用JavaScript,则HtmlUnit将运行页面上嵌入的所有JS。但是,如果不需要某些外部URL,则可以选择不加载它们。

这里是一些代码,可帮助您开始:

    webClient.setWebConnection(new FalsifyingWebConnection(webClient) {
        @Override
        public WebResponse getResponse(WebRequest request) throws IOException {

            if(request.getUrl().getPath().toLowerCase().equals("some url i don't need ")) {
                return createWebResponse(request, "", "application/javascript");
            }

            return super.getResponse(request);
        }
    });

设置以下内容可能会加快速度:

    java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF); 

    webClient.setCssErrorHandler(new SilentCssErrorHandler());

    webClient.setIncorrectnessListener(new IncorrectnessListener() {
        @Override
        public void notify(String s, Object o) { }
    });

    webClient.getCookieManager().setCookiesEnabled(false);
    webClient.getOptions().setCssEnabled(false);
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.getOptions().setPrintContentOnFailingStatusCode(false);

谢谢,我刚试了第二部分,确实有所帮助。我明天会尝试第一部分,看看效果如何。你有没有其他工具的想法?据我所知,这是一个测试工具,因此它的工作速度较慢,以便处理不规范的代码。由于我正在使用它来测试明显正常的网站,你知道是否有更快的工具可用吗? - Sam Bobel
@user3598519 你也可以尝试一下phantomJS。它运行速度相当快。但是HtmlUnit更加强大稳定。 - Neil McGuigan
使用NodeJS怎么样?我刚开始了解它,看起来它很快,但也许在功能上有一些我不知道的限制。对于加载网页、从页面运行JavaScript命令并收集结果的任务,NodeJS是否是更快的选择? - Sam Bobel
@SamBobel 我对 Node 不够了解,无法发表评论。 - Neil McGuigan
我也遇到了同样的问题。 - Shashank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接