【问题标题】:Java: HtmlUnit problem retrieving page titleJava:检索页面标题的 HtmlUnit 问题
【发布时间】:2022-01-04 10:46:22
【问题描述】:

这是我的第一篇 StackOverflow 帖子,所以我会尽量描述我的问题。

我想创建一个程序来从 TripAdvisor 页面检索评论,我尝试通过 API 来完成,但当我请求 API 密钥时他们没有响应,所以我的替代方法是使用 WebCrawler 来完成。

为此,我有一个 Spring 项目并使用 HtmlUnit,这是我从未使用过的工具,因此为了测试它,我的第一个练习是检索网页的标题,因此我实现了以下代码:

@PostConstruct
public void init() throws Exception {
    TimeZone.setDefault(TimeZone.getTimeZone("Europe/Madrid"));

    getRequest.getPageName();

}

调用如下方法:

@Test
public void getPageName() throws Exception {
    try (final WebClient webClient = new WebClient()) {
        final HtmlPage page = webClient.getPage("https://www.tripadvisor.com");
        
        System.out.println(page.getTitleText());

    }
    catch (Exception e){
        System.out.println("ERROR " + e);
    }
}

当我使用https://www.google.com 运行代码时,我得到了预期的响应“Google”,但是当我使用https://www.tripadvisor.comhttps://www.youtube.com 尝试它时,我得到一个我无法理解的错误:

Caused by: net.sourceforge.htmlunit.corejs.javascript.EvaluatorException: syntax error (https://static.tacdn.com/assets/DDGchX.17d9b05f.js#1)

我做了一个快速研究,看看这个问题是什么意思,我发现了一些关于类似案例的帖子,但我不明白是什么原因。它与Javascript问题有关吗?还是权限问题?

如果需要更多信息来分析问题,请不要犹豫,提前感谢任何读者花费的时间,如果我不尊重任何 StackOverflow 规则/协议,我们深表歉意。

【问题讨论】:

  • 这能回答你的问题吗? HtmlUnit ignore JavaScript errors?
  • @tgdavies 不是真的,他们建议使用 client.getOptions().setThrowExceptionOnScriptError(false); 来抑制错误;但是当我使用它时,我不断收到相同的错误,并且它不会在任何地方打印网页名称。我现在很困惑,我应该切换到另一个爬取工具而不是 HtmlUnit 吗?

标签: javascript java web-crawler htmlunit


【解决方案1】:
    try (final WebClient webClient = new WebClient()) {
        webClient.getOptions().setThrowExceptionOnScriptError(false);

        final HtmlPage page = webClient.getPage("https://www.tripadvisor.com");
        // final HtmlPage page = webClient.getPage("https://www.youtube.com");

        System.out.println("****************");
        System.out.println(page.getTitleText());
        System.out.println("****************");
    }
    catch (Exception e){
        System.out.println("ERROR " + e);
    }

至少对于最近的版本哦,HtmlUnit 这会产生

****************
Tripadvisor: Read Reviews, Compare Prices & Book
****************

setThrowExceptionOnScriptError 有什么作用?

/**
 * Changes the behavior of this webclient when a script error occurs.
 * @param enabled indicates if exception should be thrown or not
 */

HtmlUnit 使用 Rhino (https://github.com/mozilla/rhino) 作为 JavaScript 支持的基础。而且 Rhino 并不支持当今 JavaScript 中可用的所有语言功能(每个版本都会变得更好https://htmlunit.sourceforge.io/changes-report.html)。但至少有一些页面使用此功能(例如跟踪您),因此您会看到错误。 HtmlUnit 最初是作为测试框架设计的,因此它会在每次出现错误时停止。

如果您更改它(请参阅上面的选项设置),您仍然会获得每个错误的日志输出,但 javascript 处理会继续(在真实浏览器中相同)。您还可以更改日志记录 - 请参阅 https://htmlunit.sourceforge.io/logging.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多