用java抓一个angularjs网站
我需要抓一个Angular内容“插入”的网站。 它需要用java来完成。
我尝试过Selenium Webdriver(因为我之前使用过Selenium来抓取不那么动态的网页)。 但我不知道如何处理Angular部分。 除了页面头部的脚本标签外,网站中只有一个地方有Angular属性:
我在这里找到了这篇文章 ,老实说……我无法弄明白。 似乎作者正在选择(让我们称之为)’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 to all。 这基本上意味着javascript可能有问题。 然而,HtmlUnit确实似乎意识到页面上有javascript,这比我以前更多。 我确实(当我对exception进行搜索时)确认HtmlUnit中有一个function,它应该确保你没有看到javascriptexception。 我关掉了,但无论如何我得到了例外。 这是代码:
webClient.getOptions().setThrowExceptionOnScriptError(false);
我会发布更多的代码,但基本上没有什么可以破坏动态内容,我很确定它不是代码错误,它只是不是正确的解决方案。
我能得到一些帮助吗?
最后,我遵循了Madusudanan的优秀建议,并研究了PhantomJS / Selenium组合。 实际上有一个解决方案! 它叫做PhantomJSDriver。
你可以在这里找到maven依赖。 这里有关于鬼司机的更多信息。
Maven中的设置 – 我添加了以下内容:
net.sourceforge.htmlunit htmlunit 2.41.0 com.github.detro phantomjsdriver 1.2.0
它还运行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 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选择器读取任何标记信息
Interesting Posts
有一种简单的方法可以在Jhipster微服务网关上添加社交登录吗?
运行grunt和tomcat服务器的Web App(Spring,Angular,Grunt,Maven,Tomcat)
异步执行多个任务并在JavaScript函数中返回第一个成功的结果
预检的响应具有无效的HTTP状态代码:401 angular
如何设置Grails和AngularJS部分模板
在预检响应中,Access-Control-Allow-Methods不允许使用方法DELETE
为什么不能从ui应用程序读取spring boot angularjs网关应用程序?
Access-Control-Allow-Origin是否足以防止XSRF攻击?
如何从AngularJSpost中获取Struts中的数据
Spring MVC – AngularJS – 文件上传 – org.apache.commons.fileupload.FileUploadException