【问题标题】:Web Scraping with Java using HTMLUnit使用 HTMLUnit 使用 Java 进行网页抓取
【发布时间】:2018-12-29 04:56:59
【问题描述】:

我正在尝试网络抓取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();
            }
        }
    }

【问题讨论】:

    标签: java web-scraping htmlunit


    【解决方案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 支持中存在一个已知错误。因为这个 bug 是从 main.js 抛出的,所以我猜这将在生成您要查找的内容之前停止页面 javascript 的处理。

    到目前为止,我没有时间解决这个问题(看起来这个问题必须在 Rhino 中解决)但是这个在列表中。

    查看https://twitter.com/HtmlUnit 以了解更新。

    【讨论】:

    • 感谢您的回复,如果您不介意我问,您知道其他语言是否可以帮助我吗?
    • 带有无头浏览器(FF 或 Chrome)的 Selenium
    【解决方案2】:

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

    client.getOptions().setJavaScriptEnabled(false);
    

    client.getOptions().setJavaScriptEnabled(true);
    

    应该做的伎俩

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多