【问题标题】:how to make jsoup wait for the complete page(skip a progress page) to load? [duplicate]如何让 jsoup 等待完整页面(跳过进度页面)加载? [复制]
【发布时间】:2016-07-06 19:50:13
【问题描述】:

我正在尝试使用 Jsoup 解析网页并提取数据。但是该链接是动态的,在显示详细信息之前会弹出一个等待加载页面。所以 Jsoup 似乎处理的是等待页面而不是详细信息页面。有没有办法让这个等到页面完全加载?

【问题讨论】:

  • 能否请您添加网址和真实示例?
  • 你可以在这里尝试 ui4j 而不是 Jsoup:github.com/ui4j/ui4j.

标签: java web-scraping jsoup


【解决方案1】:

我想我只是在扩展 luksch 的答案。我不熟悉网络框架,所以答案看起来有点难以理解。由于使用 Jsoup 之类的解析器动态加载页面很困难,因为我们必须在尝试解析之前知道所有元素都已完全加载。因此,不要立即解析,而是使用 webdriver(selenium) 检查元素状态,一旦加载,获取页面源并解析或使用 webdriver 本身来收集所需的数据,而不是使用单独的解析器。

WebDriver driver = new ChromeDriver();
    driver.get("<DynamicURL>");
    List<WebElement> elements = null;
    while (elements == null)
    {
        elements = driver.findElements(By.className("marker"));
        if (!valuePresent(elements))
        {
            elements = null;
        }
    }
    if (elements != null)
    {
        processElements(elements);
    }

【讨论】:

    【解决方案2】:

    如果某些内容是在页面加载后动态创建的,那么解析完整内容的最佳机会是使用 Selenium 和 JSoup:

    WebDriver driver = new FirefoxDriver();
    driver.get("http://stackoverflow.com/");
    Document doc = Jsoup.parse(driver.getPageSource());
    

    【讨论】:

    • 在这里,如果我试图解析的网页有 java 脚本,那么它不会等待执行,我会得到一个等待或加载页面。所以可能等待元素加载而不是使用 jsoup 立即解析可能是更好的方法。这似乎对我有用。可能是因为我最初的问题包括 Jsoup 的使用,所以您的回答也包括 jsoup。也许我应该更好地表达我的问题。谢谢!
    【解决方案3】:

    可能,有问题的页面是由浏览器(客户端)中的 JavaScript 生成的。 Jsoup 不解释 JavaScript,所以你不走运。但是,您可以在浏览器开发人员工具的网络选项卡中分析页面加载,并找出在页面加载期间进行了哪些 AJAX 调用。这些调用也有 URL,您可以通过直接访问它们来获得所需的所有信息。或者,您可以使用真正的浏览器引擎来加载页面。如果您使用的是 Java 8,则可以使用 selenium webdriver 之类的库或 JavaFX webkit 组件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多