毎日が86400秒の残り時間

ビル・ゲイツのように計画実行のスピードを上げる

焦らず、しかし休まず、星のように己がまわりを巡れ
(ヨハン・ヴォルフガング・フォン・ゲーテ)

PHPでRSSデータを取得する方法

はてなブックマークのホットエントリーのデータを取得したい。

PHPRSSのデータを取得する方法を試行錯誤した。(メモ)

 

<?php
$keyword = '経済';
$url = 'http://b.hatena.ne.jp/search/tag?mode=rss&safe=on&users=50&q='.urlencode($keyword);
$options = ['http' => ['header' => 'User-Agent: Entrylist crawler', ], ];
$context = stream_context_create($options);
$feed = file_get_contents($url, false, $context);
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$arr = json_decode($json,TRUE);
print_r($arr);
?>

 

はてなブックマークRSSを表示するページにアクセスするとき、(ブラウザーの)ユーザーエージェントに相当するデータを送信しないと取得できない。

そのため、3行目の$options、4行目の$contextで、ユーザーエージェントのデータを用意している。

 

5行目のfile_get_contents()関数で、RSSデータ(XML形式)を取得している。

その後、XMLデータを加工して、欲しい情報を得ればOK

 

ここでは単純にsimplexml_load_string()関数でXMLをパースしているが、ここで問題が発生!!!

simplexml_load_string()関数では、細かい情報が抜けてしまうようだ。

ググったら、XMLをパースする他の方法が紹介されていて、この抜けは防止できることが分かった。

 

PHP: DOMDocument::loadXML - Manual

(PHP 5, PHP 7)

DOMDocument::loadXML — 文字列から XML を読み込む

 

<?php
$keyword = '経済';
$url = 'http://b.hatena.ne.jp/search/tag?mode=rss&safe=on&users=50&q='.urlencode($keyword);
$options = ['http' => ['header' => 'User-Agent: Entrylist crawler', ], ];
$context = stream_context_create($options);
$feed = file_get_contents($url, false, $context);
$dom = new DOMDocument();
$dom->loadXML( $feed );
$entries = array();
foreach( $dom->getElementsByTagName( "item" ) as $item ){
    $entry = array();
    foreach( $item->childNodes as $node ){
        if( $node->nodeType !== 1 ) continue;
        if( $item->getElementsByTagName( $node->nodeName )->length > 1 ){
            if( !isset( $entry[ $node->nodeName ] ) ){
                $entry[ $node->nodeName ] = array();
            }
            array_push( $entry[ $node->nodeName ], $node->nodeValue );
        } else {
            $entry[ $node->nodeName ] = $node->nodeValue;
        }
    }
    array_push( $entries, $entry );
}
var_dump( $entries );
?>

 

上記のように改造すると、細かいXMLのデータ(はてなブックマーク数とか)も取得できた。

とりあえず、これでOK。

 

こういうのって、ときどきしかやらないから、多分すぐに忘れる。

未来の自分のためにメモw