使用HTMLUnit使用Java进行Web爬取

时间:2018-12-29 04:56:59

标签: java web-scraping htmlunit

我正在尝试抓取https://www.nba.com/standings#/

这是我的代码

我要使用的是page.getByXPath(“ // caption [@ class ='standings__header'] / span”)

哪些应该撤回东部会议和西部会议,但是如果我的Xpath错误,它什么也不会撤退,我不知道?

    package Standings;

    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.gargoylesoftware.htmlunit.WebClient;
    import com.gargoylesoftware.htmlunit.html.HtmlElement;
    import com.gargoylesoftware.htmlunit.html.HtmlPage;
    import com.gargoylesoftware.htmlunit.html.HtmlSpan;

    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;

    public class Standings {
          private static final String baseUrl = "https://www.nba.com/standings#/";

        public static void main(String[] args) {
            WebClient client = new WebClient();
            client.getOptions().setJavaScriptEnabled(false);
            client.getOptions().setCssEnabled(false);
            client.getOptions().setUseInsecureSSL(true);
            String jsonString = "";
            ObjectMapper mapper = new ObjectMapper();

            try {
                HtmlPage page = client.getPage(baseUrl);
                System.out.println(page.asXml());

                page.getByXPath("//caption[@class='standings__header']/span")
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

已使用以下代码验证您的问题:

public static void main(String[] args) throws IOException {
    final String url = "https://www.nba.com/standings#/";

    try (final WebClient webClient = new WebClient()) {
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setUseInsecureSSL(true);

        HtmlPage page = webClient.getPage(url);
        webClient.waitForBackgroundJavaScript(10000);

        System.out.println(page.asXml());
    }
}

运行此命令时,我在日志中收到一堆警告和错误。

(顺便说一句:在实际的浏览器上运行时,该页面还会产生许多错误/警告。该页面的维护者对质量的看法似乎很有趣)

我想问题是这个错误

TypeError:无法修改只读属性:构造函数。 (https://www.nba.com/ng/game/main.js#1

HtmlUnit(https://sourceforge.net/p/htmlunit/bugs/1897/)的javascript支持中存在一个已知的错误。因为该错误是从main.js抛出的,所以我猜想这会在生成您要查找的内容之前停止对页面javascript的处理。

到目前为止,我发现没有时间修复此问题(看起来必须在Rhino中修复),但此列表已列出。

查看https://twitter.com/HtmlUnit以获得有关更新的信息。

答案 1 :(得分:0)

您要抓取的页面需要Javascript才能正确显示。如果禁用它,则大多数元素将不会加载。 换行

client.getOptions().setJavaScriptEnabled(false);

client.getOptions().setJavaScriptEnabled(true);

应该可以解决问题