首页 > 解决方案 > Jsoup 从一开始只获取几行 HTML,甚至不到 25%

问题描述

当我尝试在网站上执行 CTRL+U 时,它也比我从 jsoup 得到的更多。正在使用的站点是 Open SAP -> https://open.sap.com/courses 已尝试超时和 maxbodysize 以及 jsoup.connect。现在我的代码如下所示:

private static String getHtml(String location) throws IOException {
    URL url = new URL(location);
    URLConnection conn = url.openConnection();
    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String input;
    StringBuilder builder = new StringBuilder();
    while((input = in.readLine()) != null)
    {
         builder.append(input);
    }

    return builder.toString();
}
document = Jsoup.parse(getHtml(URL));

但仍然返回相同的 HTML。通过硒它是可能的,但它有点慢所以任何其他方式来实现这一点?因为目标是找出课程的链接,然后加载它们以找到他们的课程摘要,使用 selenium 会太慢。

请建议在这里可以做什么。

标签: seleniumweb-scrapingjsouphtmlunit

解决方案


这个页面的页面内容是在你的浏览器内部基于js构建的。您需要一个支持 js 的框架来执行此操作。

使用 HtmlUnit 我得到了这样的页面

String url = "https://open.sap.com/courses";

try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_68)) {
    webClient.getOptions().setThrowExceptionOnScriptError(false);

    HtmlPage page = webClient.getPage(url);
    webClient.waitForBackgroundJavaScriptStartingBefore(10_000);

    System.out.println("-------------------------------");
    System.out.println(page.asText());
    System.out.println("-------------------------------");
}

HtmlUnit 有一个丰富的 API 可以对页面对象做任何你喜欢的事情,比如搜索控件/内容、单击控件或从页面的某些部分提取文本。


推荐阅读