AD
  1. >
  2. >

PHP FeedWriterを使って他サイトのRSS/Atomのフィードを生成してみる

 

フィード 作成

RSS/Atomのフィードを生成したい

情報収集にはRSS等のフィードをFeedlyで閲覧するのが便利だが、RSS/Atomのフィードが配信されてないサイトもある。そういうサイトのためにフィードを生成するサービスもあるみたいだが、なんか使いたくない。なので、知識をつけるためにも自分でフィードを生成する方法を調べてみた。

見つけました!「PHPでRSS、AtomのFeedを作成する方法

PHP Universal Feed GeneratorというものがFeedWriterという形でGitHubに公開されています。それと、WEBスクレイピングをするためのphpQueryを使います。phpQueryは「phpQuery-[バージョン]-onefile.zip」をダウンロードしてください。

Atomのフィードを生成してみる

ファイルを読み込みます。RSS1.0、RSS2.0、Atomの違いとかわからないので今回はとりあえず一番新しい形式であるAtomのフィードを生成してみます。

PHP
require_once('phpQuery-onefile.php');
require_once('Item.php');
require_once('Feed.php');
require_once('ATOM.php');

次に初期設定をします。タイムゾーンの指定、取得するページURLなど必要な記述をします。今回はテストとして、Youtube急上昇動画のページを指定しています。

PHP
date_default_timezone_set( 'Asia/Tokyo' );

use \FeedWriter\ATOM;
$feed = new ATOM;

$url = 'https://www.youtube.com/feed/trending';

//サイト情報登録
$feed->setTitle('YouTube');
$feed->setLink($url);
$feed->setDate(new DateTime());

Youtube急上昇動画のページを取得します。テストプログラムのため、タイトルとリンクしか登録していません。

PHP
//データ取得
$html = file_get_contents($url); //ページ取得
$doc = phpQuery::newDocument($html); //phpQueryの決まり文句
$data = $doc['.expanded-shelf-content-item-wrapper']; //記事部分のクラスを指定

foreach($data as $key => $val){ //取得した記事部分のループ
   //アイテム情報初期化
   $item = $feed->createNewItem();
   
   //アイテム情報登録
   $item->setTitle( pq($val)->find('.yt-lockup-title a')->text() ); //タイトル
   $item->setLink( pq($val)->find('.yt-lockup-title a')->attr('href') ); //リンク
   //$item->setDate( strtotime('2016-03-08 18:00') );
   //$item->setAuthor('著者');
   //$item->setDescription('内容');

   //アイテム追加
   $feed->addItem( $item );
}

最後にフィードを生成、ファイルを保存。

PHP
//フィード生成
$xml = $feed->generateFeed();

//ファイル保存
file_put_contents( 'atom.xml' , $xml );

Atomのフィードが生成できた!

予想以上に簡単にフィードを生成できました。このプログラムをレンタルサーバーのcronに登録すれば自動的にフィードが生成されることになります。それをFeedlyなどで情報収集できるのです。

もちろん、生成したフィードはFeedlyがアクセスできるようにサーバー上に上げる必要があります。ただ、Feedlyって登録者の少ないフィードはクロールされる頻度が少ないです。ですので、この自分用に生成したフィードはローカル型のRSSリーダーで取得したほうがいいかもしれませんね。

RSS/Atomフィードが配信されていないサイトでもこのプログラムのURLやクラス指定を変えるだけでフィードが生成することができるようになりました。

  • B!