やったこと

webサービスを作るときに考えたことを垂れ流します

【PHP】ニコニコ動画ランキングのRSSを読み込んで情報をパースする!

ニコニコ公式のRSSを利用して「動画ランキング」の情報を取得することができます。

例えば「政治カテゴリ」の「本日の動画ランキング」の情報は以下URLで取得できます。
http://www.nicovideo.jp/ranking/view/daily/politics?rss=2.0

上記URLを叩くと、以下のようなxmlデータが返ってきます。

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    
      <title>政治の再生ランキング(24時間)‐ニコニコ動画</title>
      <link>http://www.nicovideo.jp/ranking/view/daily/politics</link>
      <description>毎時更新</description>
      <pubDate>Tue, 26 Jan 2016 20:00:00 +0900</pubDate>
      <lastBuildDate>Tue, 26 Jan 2016 20:00:00 +0900</lastBuildDate>
      <generator>ニコニコ動画</generator>
      <language>ja-jp</language>
      <copyright>(c) DWANGO Co., Ltd.</copyright>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    
  <atom:link rel="self" type="application/rss+xml" href="http://www.nicovideo.jp/ranking/view/daily/politics?rss=2.0"/>

    
                <item>
        <title>第1位:政治家になりたいという野望はありますか?【KAZUYAの質問コーナー】</title>
        <link>http://www.nicovideo.jp/watch/so28079649</link>
        <guid isPermaLink="false">tag:nicovideo.jp,2016-01-25:/watch/so28079649</guid>
        <pubDate>Tue, 26 Jan 2016 20:00:00 +0900</pubDate>
        <description><![CDATA[
                      <p class="nico-thumbnail"><img alt="政治家になりたいという野望はありますか?【KAZUYAの質問コーナー】" src="http://tn-skr2.smilevideo.jp/smile?i=28079649" width="94" height="70" border="0"/></p>
                                <p class="nico-description">★質問、ご意見はこちらからお願いします→https://goo.gl/ETuOAm★こちらの動画もご覧下さい→watch/1445350332★新著!「超日本人の時代 お花畑からの脱却」→http://amzn.to/1NuNDr7★今後の講演情報→http://kazuyahkd.com/eventNET News Station|KAZUYA CHANNEL GX★このチャンネルの「お気に入り」登録お願いします★----------------------------------・ニコニコ生放送はこちらから  →http://ch.nicovideo.jp/kazuyagx/live・YouTubeで動画投稿しています。是非YouTubeでチャンネル登録をお願いします!  →http://www.youtube.com/user/kazuyahkd・前watch/1453628712・KAZUYA Channelマイリス→mylist/36734521・大体1分ニュースマイリス→mylist/47422680----------------------------------・KAZUYA twitter|@kazuyahkd  →https://twitter.com/kazuyahkd・KAZUYA BLOG  →http://kazuyahkd.com/----------------------------------運営(和田)twitter | @media_otb  →https://twitter.com/media_otb----------------------------------▼NET News Station|KAZUYA CHANNEL GX  http://ch.nicovideo.jp/kazuyagx</p>
                                <p class="nico-info"><small><strong class="nico-info-number">34,384</strong>pts.|<strong class="nico-info-length">4:39</strong>|<strong class="nico-info-date">2016年01月25日 21:00:00</strong> 投稿<br/><strong>合計</strong>&nbsp;&#x20;再生:<strong class="nico-info-total-view">34,384</strong>&nbsp;&#x20;コメント:<strong class="nico-info-total-res">1,236</strong>&nbsp;&#x20;マイリスト:<strong class="nico-info-total-mylist">114</strong><br/><strong>日間</strong>&nbsp;&#x20;再生:<strong class="nico-info-daily-view">34,384</strong>&nbsp;&#x20;コメント:<strong class="nico-info-daily-res">1,233</strong>&nbsp;&#x20;マイリスト:<strong class="nico-info-daily-mylist">114</strong><br/></small></p>
                  ]]></description>
      </item>
                <item>
・
・
・


これをPHPでパースしてみました。コードは以下のようなもの。

<?php
$rss_url = "http://www.nicovideo.jp/ranking/view/daily/politics?rss=2.0";
$xml = simplexml_load_file ($rss_url);

foreach ($xml->channel->item as $entry){
  //順位を取得
  $subject = (string)$entry->title;
  $pattern = '/第([0-9]+)位:/';
  preg_match($pattern, $subject, $matches);
  $rank = isset($matches[1]) ? $matches[1] : "";

  //タイトルを取得
  $pos = mb_strlen("第".$rank."位:");
  $title = substr((string)$entry->title, $pos);

  //再生数を取得
  $subject = (string)$entry->description;
  $pattern = '/再生:<strong class="nico-info-total-view">([0-9|,]+)<\/strong>/';
  preg_match($pattern, $subject, $matches);
  $views = isset($matches[1]) ? $matches[1] : "";

  //コメント数を取得
  $pattern = '/コメント:<strong class="nico-info-total-res">([0-9|,]+)<\/strong>/';
  preg_match($pattern, $subject, $matches);
  $comments = isset($matches[1]) ? $matches[1] : "";

  //マイリス数を取得
  $pattern = '/マイリスト:<strong class="nico-info-total-mylist">([0-9|,]+)<\/strong>/';
  preg_match($pattern, $subject, $matches);
  $mylists = isset($matches[1]) ? $matches[1] : "";

  //再生時間を取得
  $pattern = '/<strong class="nico-info-length">([0-9]+:[0-9]+)<\/strong>/';
  preg_match($pattern, $subject, $matches);
  $play_time = isset($matches[1]) ? $matches[1] : "";

  //サムネイル画像URLを取得
  $pattern = '/(http.+smile\?i=[0-9]+)/';
  preg_match($pattern, $subject, $matches);
  $img_url = isset($matches[1]) ? $matches[1] : "";

  echo "--------"."\n";
  echo "順位:".$rank."\n";
  echo "タイトル:".$title."\n";
  echo "再生数:".$views."\n";
  echo "コメント数:".$comments."\n";
  echo "マイリス数:".$mylists."\n";
  echo "再生時間:".$play_time."\n";
  echo "画像URL:".$img_url."\n";
}

?>


このマクロを叩くと以下のような情報が出力されます。

--------
順位:1
タイトル:政治家になりたいという野望はありますか?【KAZUYAの質問コーナー】
再生数:36,257
コメント数:1,284
マイリス数:115
再生時間:4:39
画像URL:http://tn-skr2.smilevideo.jp/smile?i=28079649
--------
順位:2
タイトル:安倍が悪いから中止になった琉球大学学生会会長選挙www
再生数:57,075
コメント数:1,625
マイリス数:136
再生時間:3:11
画像URL:http://tn-skr3.smilevideo.jp/smile?i=28072838
--------
順位:3
タイトル:ノノムラー会見
再生数:1,258,459
コメント数:15,660
マイリス数:22,693
再生時間:1:36
画像URL:http://tn-skr3.smilevideo.jp/smile?i=23935946
--------
・
・
・


正規表現を使ったり文字列を削ったり、いろいろなことをしなきゃいけなくて、意外と大変でした・・。


以上です。