PHPでRSSデータを取得する方法
はてなブックマークのホットエントリーのデータを取得したい。
PHPでRSSのデータを取得する方法を試行錯誤した。(メモ)
<?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
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