从HTML获取动态内容

时间:2017-11-10 15:59:21

标签: php json regex curl

我尝试使用以下代码从html页面捕获div的内容:

    $result = file_get_contents("http://bo.cope.webtv.flumotion.com/api/active?format=json&podId=78");
    $array_full=(json_decode($result, true));
    $symbols = array('"','}','{');
    $array_full['value'] = str_replace($symbols, "", $array_full['value']);

    $array_author_title= explode(",", $array_full['value']);
    $array_author = explode(":", $array_author_title[1]);
    $array_title = explode(":", $array_author_title[2]);

    echo "Author: ".$array_author[1];
    echo "</br>Title: ".$array_title[1];

结果为空,因为该代码是由javascript或ajax生成的。 除了使用https://github.com/neorai/php-webdriver之外还有其他方法吗?

解决方案:

np.loadtxt

感谢:@urban和How to use cURL to get jSON data and decode the data?

1 个答案:

答案 0 :(得分:0)

此页面加载很奇怪(似乎它正在触发3 loadFinished个事件!无论如何,以下代码有效:

// "Normal" JS
function waitForMetadata() {
    // Initialize global meta
    var meta = page.evaluate(function() {
        return document.getElementById("metadata_player")
    }); 

    var txt = meta.innerHTML;
    console.log("meta: '" + meta.outerHTML + "'")
    if (txt != "") {
        phantom.exit(0);
    } else {
        setTimeout(waitForMetadata, 1000);
    }
}


// PhantomJS
var page = require('webpage').create();
page.open('http://player.rockfm.fm/')
page.onLoadFinished = function(status) {
    console.log("Status: " + status);
    if(status !== "success") {
        console.log("FAIL!")
        phantom.exit(1);
    }

    waitForMetadata();
};

第一部分是一个检查div内容的函数,如果它是空的,它会自行安排,否则打印和退出。第二部分直接出自phantomJS教程:声明一个页面,注册一个onLoad函数并加载它。

示例输出:

urban@kde-2:/tmp$ phantomjs  ./test.js 
Status: success
meta: '<div id="metadata_player"></div>'
Status: success
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player"></div>'
meta: '<div id="metadata_player">GUNS N' ROSES<br><span id="artist">KNOCKIN' ON HEAVEN'S DOOR</span></div>'

注意:加载内容后,使用JS可以做任何你喜欢的事情(而不是打印)。另外,我想你想稍后使用span id=artist ......

更新1

这让我很顽固......我无法用phantomjs来制作它但是,我检查了这个页面制作的ajax调用,看起来你可以用以下内容播放当前播放的歌曲:

$ curl 'http://bo.cope.webtv.flumotion.com/api/active?format=json&podId=78'
{"id": null, "uuid": "DFLT", "value": "{\"image\": \"\", \"author\": \"AEROSMITH\", \"title\": \"AMAZING\"}"}

这意味着您可以使用您喜欢的任何语言和json_decode两次:(1)对于包含iduuidvalue以及(2)的外部地图解码value。我唯一担心的是podId会发生变化......但似乎是静态的。

希望有所帮助