我需要抓取一个由 Angular“插入”内容的网站。而且需要用java来完成。
我尝试过 Selenium Webdriver (因为我之前使用过 Selenium 来抓取动态性较低的网页)。但我不知道如何处理 Angular 部分。除了页面头部的 script 标签之外,站点中只有一处存在 Angular 属性:
<div data-ng-module="vindeenjob"><div data-ng-view=""></div>
I found 本文在这里,但说实话......我不明白。似乎作者正在选择(让我们称之为)“ng-attributes”,如下所示
WebElement theForm = wd.findElement(By.cssSelector("div[ng-controller='UserForm']"));
但未能解释他为什么这样做。在他的演示页面的源代码中,我找不到任何名为“UserForm”的内容......所以原因仍然是个谜。
然后我尝试为 Selenium 设置一个时间间隔,希望页面能够被渲染,并且我最终可以在等待期后获取结果,如下所示:
WebDriver webdriver = new HtmlUnitDriver();
webdriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
webdriver.get("https://www.myurltoscrape.com");
但无济于事。然后还有本文,这给出了一些有趣的例外,例如无法设置仅具有 getter 的属性 [HTMLStyleElement].media。这基本上意味着 javascript 可能有问题。然而,HtmlUnit 似乎确实意识到页面上有 javascript,这比我之前得到的要多。我确实意识到(因为我对异常进行了搜索)HtmlUnit 中有一个功能可以确保您看不到 javascript 异常。我把它关掉了,但我还是遇到了例外。这是代码:
webClient.getOptions().setThrowExceptionOnScriptError(false);
我会发布更多代码,但基本上没有什么会刮掉动态内容,我很确定这不是代码错误,它只是还不是正确的解决方案。
我可以寻求帮助吗?