当前位置: 首页 > 面试题库 >

用Java抓取angularjs网站

宗政鸿志
2023-03-14
问题内容

我需要抓取一个网站,其内容由Angular“插入”。它需要用java完成。

我已经尝试过Selenium
Webdriver(因为我之前曾使用Selenium来抓取较少动态的网页)。但是我不知道如何处理Angular部分。除了页面顶部的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只能使用所有吸气剂。

这基本上意味着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();
}


 类似资料:
  • 问题内容: 所以,我的问题相对简单。我有一只蜘蛛在多个站点上爬行,我需要它按照我在代码中写入的顺序返回数据。它发布在下面。 结果以随机顺序返回,例如,返回29,然后28,然后30。我已经尝试将调度程序的顺序从DFO更改为BFO,以防万一这是问题所在,但这并没有改变。 问题答案: 定义在方法中使用的URL 。下载页面时,将为你的方法调用每个起始URL的响应。但是你无法控制加载时间-第一个起始URL可

  • 本文向大家介绍详解JAVA抓取网页的图片,JAVA利用正则表达式抓取网站图片,包括了详解JAVA抓取网页的图片,JAVA利用正则表达式抓取网站图片的使用技巧和注意事项,需要的朋友参考一下 利用Java抓取网页上的所有图片: 用两个正则表达式: 1、匹配html中img标签的正则:<img.*src=(.*?)[^>]*?> 2、匹配img标签中得src中http路径的正则:http:\"?(.*?

  • 完全新的Java和J汤。我试图创建一个简单的程序,刮网络,给我Java股市的数据。我想从道琼斯股票开始,让它打印出52周的区间数据。它转到http://finance.yahoo.com/quote/AAPL?ltr=1,查看左下表(从上一次收盘价开始),然后下到第5个索引,从那里获取文本值。我得到的错误: 线程“main”组织中出现异常。jsoup。选择选择器$SelectorParseExce

  • 我是python新手,正在尝试从以下站点获取数据。虽然这段代码适用于不同的站点,但我无法让它适用于nextgen stats。有人想知道为什么吗?下面是我的代码和我得到的错误 下面是我得到的错误 df11=pd。读取html(urlwk1)回溯(上次调用):文件“”,第1行,在文件“C:\Users\USERX\AppData\Local\Packages\PythonSoftwareFounda

  • 我正试图浏览一个网站。我尝试过使用两种方法,但都没有提供完整的网站源代码,我正在寻找。我正试图从下面提供的网站URL中获取新闻标题。 URL:"https://www.todayonline.com/" 这是我尝试过但失败的两种方法。 请帮忙。我试着抓取其他新闻网站,这要容易得多。谢谢你。

  • 问题内容: 在先前的问题中,一位作者建议使用aiohttp的新语法从中获取多个网址: 但是,当其中一个请求中断时(如上所述,由于导致错误),则错误不会得到处理,整个中断。 我就开始寻找插入有关的结果的测试,比如找地方了,或者一个,但我只是不理解如何与工作,与各种对象。 由于仍然很新,因此没有很多示例。如果向导可以显示如何执行此操作,对许多人来说将非常有帮助。毕竟,大多数人想要测试的第一件事就是同时