[英]scrape an angularjs website with java
我需要抓取一个由 Angular '插入'内容的网站。 而且需要用java来完成。
我已经尝试过 Selenium Webdriver(因为我之前使用 Selenium 来抓取较少动态的网页)。 但我不知道如何处理 Angular 部分。 除了页面 head 部分的 script 标签外,站点中只有一个地方有 Angular 属性:
<div data-ng-module="vindeenjob"><div data-ng-view=""></div>
我在这里找到了这篇文章,但老实说......我无法弄清楚。 似乎作者正在选择(让我们称之为)这样的“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");
但无济于事。 然后还有这篇文章,它给出了一些有趣的例外,例如无法设置属性 [HTMLStyleElement].media ,它只有一个 getter 。 这基本上意味着javascript可能有问题。 但是,HtmlUnit 似乎确实意识到页面上有 javascript,这比我之前得到的要多。 我确实意识到(因为我对异常进行了搜索)HtmlUnit 中有一个功能可以确保您看不到 javascript 异常。 我关闭了它,但无论如何我都会遇到例外情况。 这是代码:
webClient.getOptions().setThrowExceptionOnScriptError(false);
我会发布更多代码,但基本上没有什么会刮掉动态内容,我很确定这不是代码错误,它只是还不是正确的解决方案。
我可以得到一些帮助吗?
最后,我遵循了 Madusudanan 的出色建议,并研究了 PhantomJS / Selenium 组合。 实际上有一个解决方案! 它被称为 PhantomJSDriver。
您可以在此处找到 maven 依赖项。 这里有更多关于幽灵驱动程序的信息。
Maven 中的设置 - 我添加了以下内容:
<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();
}
这是使用 Java 使用 JSoup 和 WebDriver 废弃任何网页的完美解决方案
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver driver = new romeDriver(chromeOptions);
driver.get(bean.getDomainQuery().trim());
Document doc = Jsoup.parse(driver.getPageSource());
然后使用 JSoup 选择器读取任何标签信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.