我需要抓一个Angular内容“插入”的网站.它需要用java完成.
我尝试过Selenium Webdriver(因为我之前使用过Selenium来抓取不那么动态的网页).但我不知道如何处理Angular部分.除了页面头部的脚本标签外,网站中只有一个地方有Angular属性:
<div data-ng-module="vindeenjob"><div data-ng-view=""></div>
我在这里找到了this article,但说实话……我无法弄明白.似乎作者正在选择(让我们称之为)’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");
但无济于事.然后还有this article,它提供了一些有趣的例外,例如无法设置属性[HTMLStyleElement] .media,它只有一个getter to all.这基本上意味着javascript可能有问题.然而,HtmlUnit似乎确实意识到页面上有javascript,这比我以前更多.我确实(当我对异常进行搜索时)确认HtmlUnit中有一个功能,它应该确保你没有看到javascript异常.我把它关掉了,但无论如何我得到了例外.这是代码:
webClient.getoptions().setThrowExceptionOnScriptError(false);
我会发布更多的代码,但基本上没有什么可以消除动态内容,我很确定它不是代码错误,它只是不是正确的解决方案.
我能得到一些帮助吗?
解决方法:
最后,我遵循了Madusudanan的优秀建议,并研究了PhantomJS / Selenium的组合.实际上有一个解决方案!它叫做PhantomJSDriver.
你可以找到maven依赖here.这是更多关于ghost driver的信息.
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.41.0</version>
</dependency>
<dependency>
<groupId>com.github.detro</groupId>
<artifactId>phantomjsdriver</artifactId>
<version>1.2.0</version>
</dependency>
它还运行Selenium 2.45版本,这是迄今为止的最新版本.我提到这一点,因为我读到的一些文章中有人说Phantom驱动程序与Selenium的每个版本都不兼容,但我想他们在此期间解决了这个问题.
如果您已经在使用Selenium / Phantomdriver组合,并且您在某个站点上收到“严格的javascript错误”,请更新您的selenium版本.这将解决它.
以下是一些示例代码:
public void testPhantomDriver() throws Exception {
DesiredCapabilities options = new DesiredCapabilities();
// the website i am scraping uses ssl, but I dont kNow what version
options.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, new String[] {
"--ssl-protocol=any"
});
PhantomJSDriver driver = new PhantomJSDriver(options);
driver.get("https://www.mywebsite");
List<WebElement> elements = driver.findElementsByClassName("media-title");
for(WebElement element : elements ){
System.out.println(element.getText());
}
driver.quit();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。