收集数据不适用于Angular.js网站

时间:2015-04-15 13:25:43

标签: javascript html angularjs web-scraping

我目前正在编写一个从体育网站收集信息的程序。 (它包含一些篮球比赛的历史)问题是该网站使用Angular.js进行动态HTML绑定。因此,HTML源代码涉及许多变量。

我需要找出变量的值,以便让我的程序按我的意愿工作。有没有可以帮助我的图书馆或框架?

编辑:我不受任何限制,但我更喜欢Web应用程序(MEAN,带有node-webkit的JS框架)。如果无法完成,我也可以用C ++或Java编写代码(或者使用NDK或SDK将其扩展到Android)


免责声明:这不是灰帽子的东西。我只需要做一些网络抓取。

2 个答案:

答案 0 :(得分:1)

PhantomJS是一个无头浏览器。它允许您使用JavaScript来获取所需的信息。

详细说明:

它将浏览到您想要的页面,像任何浏览器一样执行JavaScript,并且可以访问该页面,就像使用普通浏览器向普通用户显示一样。使用JavaScript DOM遍历,您将能够获得所需的信息。这与在浏览器中打开控制台并执行将从页面获取信息的javascript自动化任务几乎相同。

虽然以下示例非常简单,但它可以做的不仅仅是获取页面结果...它可以单击按钮,导航到其他页面,仅提取相关信息,将页面提取为图像...毫不犹豫地提及其Quick start documentation以了解更多信息。

示例脚本在等待10秒后AngularJS完成计算页面后返回完整的HTML页面:

命令行用法:phantomjs-1.9.1 this_script.js

this_script.js(PhantomJS 2.0在某些情况下可能有不同的语法):

var url = phantom.args[0]

function getDocumentElementAsHTML(page) {
  return page.evaluate(function() {
    return document.documentElement.innerHTML
  })
}

var page = new WebPage()

page.settings.userAgent = "PhantomJS"

//page.onConsoleMessage = function (msg) { console.log(msg); }

page.open(url, function (status) {
  if (status !== 'success') {
    console.log('Unable to access network')
    phantom.exit()
  } else {
    setTimeout(function(){
      console.log(getDocumentElementAsHTML(page))
      phantom.exit()
    },10000)
  }
});

PS:等待10秒并不总是一个很好的解决方案,我曾经定期测试我想要获取信息的元素的存在,以确保JavaScript完成加载。

来源:我过去做的灰帽子事件

答案 1 :(得分:1)

我说你想看看http://phantomjs.org/http://www.slimerjs.org/和/或http://casperjs.org/

幻影& Slimer分别为您提供对Webkit和Gecko的API访问。 Casper在顶部添加了更加用户友好的API。