前幾天逛湖南衛視,偶然間發現它的網站上也有節目預告,一看源碼,竟然是來自搜視網的xml,因而就想得到它的數據(頁面直接ajax加載估計會有跨域問題)php
前陣子也寫過另外一個方法得到 節目預告(採集練習(七) php 得到電視節目預告)。html
點開 金鷹網 導航上找到 電視劇 鼠標移上 電視劇 點擊裏面的 節目表 其實就 是這個連接 http://hunantv.tvsou.com/ 數據來自搜視網ajax
在頁面上點擊 湖南衛視 發現有2個 ajax 請求 json
經過分析 http://hunantv.tvsou.com/xml/ws.xml 發現 tv_24 的 24 是 湖南衛視的id ;跨域
ch_46的 46 是湖南衛視的 tvid ,而W6 則是湖南衛視 週六的 節目預告數組
根據電視臺的 xml 就能夠得到相應的 節目預告了post
其他電視臺 節目預告也相似測試
遇到的問題: 相應電視臺的 id 在 xml 節點的屬性上,之前都是直接用 DOMDocument 類來讀取,此次嘗試用 simplexml 類來處理。網站
下面是我拿央視作測試的代碼 :url
<?php /** * Created by JetBrains PhpStorm. * User: keygle * Date: 13-8-2 * Time: 下午9:55 * From: www.cnblogs.com/keygle */ /** * [getXml 讀取xml] * @param [type] $url [xml url] * @return [type] [description] */ function getXml($url){ $xmlStr = @file_get_contents($url); $xmlObj = @simplexml_load_string($xmlStr); return $xmlObj; } /** * [generateTvArray 生成電視列表數組] * @param [type] $tvUrl [xml 地址] * @return [type] $datas [電視列表數組] */ function generateTvArray($tvUrl){ $tvObject = getXml($tvUrl); $datas = array(); //得到Tv節點 $tvNode = $tvObject->Tv; //遍歷節點 for($i=0;$i<$tvNode->count();$i++){ //得到節點屬性 重組數組 foreach ($tvNode[$i]->attributes() as $k=>$v){ $datas[$i][$k] = (string)$v; //sim 對象轉爲 string $channelNode = $tvNode[$i]->Channel; for($n=0;$n<$channelNode->count();$n++){ $datas[$i]['channel'][$n]['name'] = strval($channelNode[$n]); foreach ($channelNode[$n]->attributes() as $key => $value) { $datas[$i]['channel'][$n][$key] = strval($value); } } } } return $datas; } /** * [getPlayItems 得到節目預告] * @param [type] $playItemsUrl [xml 地址] * @return [type] [array] */ function getPlayItems($playItemsUrl){ $playItemsObject = getXml($playItemsUrl); return json_decode(json_encode($playItemsObject),true); //將 simplexml 對象轉爲數組 } //得到央視的 頻道列表 $tvUrl = "http://hunantv.tvsou.com/xml/ys.xml"; $tvListArray = generateTvArray($tvUrl); print_r($tvListArray); //得到 CCTV1 週六的節目預告 $playItemsUrl = "http://hunantv.tvsou.com/pst/tv_1/ch_1/W6.xml"; $playItemsArray = getPlayItems($playItemsUrl); print_r($playItemsArray);