【问题标题】:scrape an angularjs website with java用java抓取一个angularjs网站
【发布时间】:2023-03-10 09:21:01
【问题描述】:

我需要使用 Angular“插入”的内容来抓取网站。而且需要用java来完成。

我已经尝试过 Selenium Webdriver(因为我之前使用过 Selenium 来抓取动态较少的网页)。但我不知道如何处理 Angular 部分。除了页面 head 部分的 script 标签外,站点中只有一个地方有 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']"));

但未能解释他为什么要这样做。在他的演示页面的源代码中,我找不到任何被称为“用户窗体”的东西......所以为什么仍然是个谜。

然后我尝试为 Selenium 设置一个时间间隔,希望页面能够被渲染,并且我最终可以在等待期之后获取结果,如下所示:

    WebDriver webdriver = new HtmlUnitDriver();
    webdriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    webdriver.get("https://www.myurltoscrape.com");

但无济于事。然后还有this article,它给出了一些有趣的例外,例如 Cannot set property [HTMLStyleElement].media that has only a getter to all。 这基本上意味着可能有问题javascript。但是,HtmlUnit 似乎确实意识到页面上有 javascript,这比我以前得到的要多。我确实意识到(当我对异常进行搜索时)HtmlUnit 中有一个功能可以确保您看不到 javascript 异常。我把它关了,但我还是有例外。这是代码:

webClient.getOptions().setThrowExceptionOnScriptError(false); 

我会发布更多代码,但基本上没有任何内容会刮掉动态内容,我很确定不是代码错误,只是还不是正确的解决方案。

我能得到一些帮助吗?

【问题讨论】:

  • Selenium 不是为此而设计的,尽管它能够做到。如果您的要求是纯粹的抓取,我建议Jsoup 或像Apache Nutch 这样的高级东西。
  • @Madusudanan 感谢您的评论。我已经尝试过 Jsoup,然后我在 stackoverflow 上找到了这个:link。它是很久以前的,所以 jsoup 可能已经更新,但实际上找不到关于 jsoup 和 angular 的任何内容......但我会研究 Nutch。谢谢!
  • 请注意,Nutch 实际上非常先进,不仅仅是一个网络爬虫。另请参阅Phantom JS,它实际上是一个 javascript 库,但可以由 selenium 调用。

标签: java angularjs selenium


【解决方案1】:

最后,我遵循了 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 错误”,请更新您的 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();
}

【讨论】:

  • 在哪里设置phantomjs.exe的路径?
  • 据我所知,您不必设置 phantomjs.exe 的路径。唯一需要做的就是在要运行此代码的系统上安装 phantomjs(windows 框)
【解决方案2】:

这是使用 JSoup 和 WebDriver 与 java 废弃任何网页的完美解决方案

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver driver = new romeDriver(chromeOptions);
driver.get(bean.getDomainQuery().trim());
Document doc = Jsoup.parse(driver.getPageSource());

然后使用 JSoup 选择器读取任何标签信息

【讨论】:

  • 酷,tnx!我会调查的!
猜你喜欢
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多