用java抓一个angularjs网站

时间:2015-03-30 09:03:42

标签: java angularjs selenium

我需要抓一个由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到所有。这基本上意味着可能有些错误用javascript。然而,HtmlUnit似乎确实意识到页面上有javascript,这比我以前更多。我确实(当我对异常进行搜索时)确认HtmlUnit中有一个功能,它应该确保你没有看到javascript异常。我把它关掉了,但无论如何我得到了例外。这是代码:

webClient.getOptions().setThrowExceptionOnScriptError(false); 

我会发布更多代码,但基本上没有什么可以破坏动态内容,我很确定代码不是错误的,它只是不正确的解决方案。

我能得到一些帮助吗?

2 个答案:

答案 0 :(得分:2)

最后,我遵循了Madusudanan的优秀建议,我研究了PhantomJS / Selenium组合。实际上有一个解决方案!它叫做PhantomJSDriver。

您可以找到maven依赖关系here。以下是ghost driver的更多信息。

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错误&#39;在某个网站上,更新您的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();
}

答案 1 :(得分:0)

以下是使用JSoup&amp ;;废弃任何网页的完美解决方案带java的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选择器读取任何标记信息

相关问题