アシアル株式会社主催 開発者向け、一歩先をいくためのテクニカルセミナー

<< 日本語の文字化け?について 質問一覧 データベースの登録方法について質問... >>

  • 0P
PHPで複数サイトからRSSの取得

//////////////////////////////////////////////////
追記 2010/02/16 08:22

やはり自分では実装できそうにないので
MagpieRSSというものを使おうと思っております。
ただ問題が御座いまして
$itemの配列の要素がわかりません・・・。
どの様な文字列を与えるとどういった情報が得られるのでしょうか?

またそういった解説がのっているサイトはないのでしょうか?
※調べたのですが見つかりませんでした。

  1. //-------------------------------------------------------------------------
  2.   $urls[] = 'http://rss.yomiuri.co.jp/rss/yol/topstories';
  3.   $urls[] = 'http://rss.yomiuri.co.jp/rss/yol/ranking30';    // ニュースランキング  
  4. //-------------------------------------------------------------------------
  5.   
  6.   require_once 'rss_fetch.inc';
  7.   
  8.   $site = 0;
  9.   $title = 1;
  10.   $description = 2;
  11.   $link = 3;
  12.   $time = 4;
  13.   
  14.   $count = 0;
  15.   $item_array;
  16.   
  17.   foreach ($urls as $url){
  18.     $rss = fetch_rss($url);
  19.     
  20.     foreach ($rss->items as $item ) {
  21.       $item_array[$count][$site] = mb_convert_encoding($rss->channel['title'], "UTF-8", "auto");
  22.       $item_array[$count][$title] = mb_convert_encoding($item[title], "UTF-8", "auto");
  23.       $item_array[$count][$description] = mb_convert_encoding($item[description], "UTF-8", "auto");
  24.       $item_array[$count][$link] = mb_convert_encoding($item[link], "UTF-8", "auto");
  25.       $item_array[$count][$time] = mb_convert_encoding(date('Y年m月d日',strtotime($item['dc']['date'])), "UTF-8", "auto");
  26.       $count++;
  27.     }
  28.   }
  29.   
  30.   foreach($item_array as $key => $value){
  31.     print $item_array[$key][$site]." ";
  32.     print $item_array[$key][$title]." ";
  33.     print $item_array[$key][$description]." ";
  34.     print $item_array[$key][$link]." ";
  35.     print $item_array[$key][$time]."<br>";
  36.   }

//////////////////////////////////////////////////


PHPで複数サイトからRSSの取得をしようとしております。

主にmixiニュースの様な「毎日新聞」や「読売新聞」など
複数のサイトからRSSを取得して時系列順に表示しようと考えております。

色々なサイトを見てみたのですが
何処のサイトも一つのサイトからのRSSの取得の仕方しかありませんでした。

色々なサイトのサンプルソースを見ていたのですが
どこもRSSを取得した後にすぐに
foreach($array as $key => $value)で
表示を行っていたような気がします。

すぐに表示をするのではなく複数サイトの情報を
一度配列に格納することは可能でしょうか?

例えば
  1. $title = 0;
  2. $body = 1;
  3. $place = 2; // 取得場所
  4.  
  5. foreach($array as $key => $value){
  6.   print $array[$key][$title];
  7.   print $array[$key][$body];
  8.   print $array[$key][$place];
  9. }

などと書くと表示画面に
//////////////////////////////////////////////////
○○について ××で 毎日新聞
△△について □□で 読売新聞
//////////////////////////////////////////////////

と表示されるようにしたいです。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。

QPHPで複数サイトからRSSの取得 hayato0210  [02月16日 10時54分] 
┣Re:PHPで複数サイトからRSSの取得 shimix  [02月16日 11時07分] 
┃┗Re:Re:PHPで複数サイトからRSSの取得 hayato0210  [02月16日 15時09分] 
┣Re:PHPで複数サイトからRSSの取得 moeten  [02月16日 11時42分] 
┃┣Re:Re:PHPで複数サイトからRSSの取得 shimix  [02月16日 11時57分] 
┃┃┗Re:Re:Re:PHPで複数サイトからRSSの取得 hayato0210  [02月16日 15時12分] 
┃┗Re:Re:PHPで複数サイトからRSSの取得 hayato0210  [02月16日 15時11分] 
┃  ┗Re:Re:Re:PHPで複数サイトからRSSの取得 shimix  [02月16日 15時34分] 
┃    ┗Re:Re:Re:Re:PHPで複数サイトからRSSの取得 hayato0210  [02月17日 03時20分] 
┃      ┗Re:Re:Re:Re:Re:PHPで複数サイトからRSSの取得 shimix  [02月17日 09時06分] 
┃        ┗Re:Re:Re:Re:Re:Re:PHPで複数サイトからRSSの取得 hayato0210  [02月17日 16時56分] 
┃          ┗Re:Re:Re:Re:Re:Re:Re:PHPで複数サイトからRSSの取得 magicflute2  [02月17日 18時07分] 
┗Re:PHPで複数サイトからRSSの取得 magicflute2  [02月17日 04時58分] 
  ┗Re:Re:PHPで複数サイトからRSSの取得 hayato0210  [02月17日 06時32分] 

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

Re:PHPで複数サイトからRSSの取得

>foreach($array as $key => $value)で
>表示を行っていたような気がします。
>
>すぐに表示をするのではなく複数サイトの情報を
>一度配列に格納することは可能でしょうか?

可能です。としか言えませんけど(汗

配列に格納しながら複数のサイトを巡回して、それからまとめて(日時で並べ替えてから?)表示すればいいんじゃないでしょうか。

#何がわからないのかわかりません・・・。まさか「ソースを書け」というわけじゃないでしょうね

Re:Re:PHPで複数サイトからRSSの取得

出来ればその取得用のソースを頂けないでしょうか?
何処のサイトもPEARを使っているのですが出来れば使わないで行いたいです。

わからないのは配列に格納までです・・・。
一つのサイトのRSS取得を項目ごとに
配列に入れるサンプルコードを頂けないでしょうか?

もしくわRSSのXMLファイルを取得するソースだけでも構いません。

甘えているのはわかります・・・。
本当に困っております・・・。お願い致します。

いつも回答して頂いてばかりで申し訳ないのですが
どうかお助け願えないでしょうか?

Re:PHPで複数サイトからRSSの取得

hayato0210さんこんにちは。

5行目でforeach($array as $key => $value)

を使っているようにRSSのURLを配列に入れてforeachで囲めばうまく行くと思いますよ。

  1. $rss_urls = array(
  2.   "http://hoge/rss.xml",
  3.   "http://moge/rss.xml",
  4.   "http://huge/rss.xml"
  5. );
  6.  
  7. foreach( $rss_urls as $rss ){
  8.  
  9.   //各サイトのRSSを取得
  10.   $xml = file_get_contents( $rss );
  11.  
  12.   //$xmlを配列に変換など 'XML/Unserializer.php'が便利
  13.  
  14.   //出力
  15.   $title = 0;
  16.   $body = 1;
  17.   $place = 2; // 取得場所
  18.   foreach( $array as $key => $value){
  19.     print $array[$key][$title];
  20.     print $array[$key][$body];
  21.     print $array[$key][$place];
  22.   }
  23. }

Re:Re:PHPで複数サイトからRSSの取得

moetenさん。こんにちは。

一応、質問内容で

>複数のサイトからRSSを取得して時系列順に表示しようと考えております。

とあるので、並べ替えの順位が(サイトの定義順よりも)日時の方が上なのかなと推測してます。なのでforeachでURLを回しながら表示してはマズイかなと思いますが如何でしょう?

Re:Re:Re:PHPで複数サイトからRSSの取得

ご回答ありがとうございます。

最終的にはそうしたいのですが
RSSの取得自体が出来ません。

取りあえずは値の取得を第一に考えているのですが
どのようにすればよいのでしょうか?

Re:Re:PHPで複数サイトからRSSの取得

ご回答ありがとうございます。

ソースの記載ありがとうございます。
上記のソースを試したのですが
$xmlに値が入っておりません。
※URLは変更しました。

できればこの取得の仕方を教えては頂けないでしょうか?

Re:Re:Re:PHPで複数サイトからRSSの取得

>上記のソースを試したのですが
>$xmlに値が入っておりません。

file_get_contentsでデータが取得できないとなると、XMLをparseする以前の問題ですね。単独のURL(rssの)について、

  1. <?php
  2. $url = '(どこかのBlogのRSSのURL)';
  3. $xml = file_get_contents($url);
  4. print nl2br(htmlspecialchars($xml));
  5. ?>

などとして、単一の取得だけを試してください(分解や表示は『それから』の話です)。



(蛇足)
「複数サイトからRSSの取得」というスレッドタイトルなのに、そもそも単一の取得・分解も出来ていないとは思わなかったです。最初に

>何処のサイトも一つのサイトからのRSSの取得の仕方しかありませんでした。

と書かれていましたよね。それを試してはいなかったんでしょうか?

#いくら何でも甘え過ぎじゃないですか?

Re:Re:Re:Re:PHPで複数サイトからRSSの取得

ご回答ありがとうございます。
ソースありがとうございます。
shimix様のお陰で取得まで出来ました。

但し問題が御座います・・・。
取得したものを1行ずつ配列に入れる所までは出来たのですが

それを正規表現で判定すると正しい値が取得できません。
というのも添付したソースコードを実行すると
<title>があった次の行も拾ってきてしまいます。

また、コメントにしている部分を外すと空白の分の配列ができ値がずれてしまいます。
なぜなのでしょうか・・・?

何処もPEARを使っており理解までは出来ませんでした・・・。

  1. $url = 'URL/?xml'; 
  2.   $xml = file_get_contents($url); 
  3.   print nl2br(htmlspecialchars($xml)); 
  4.   
  5.   $title = 0;
  6.   $description = 1;
  7.   
  8.   print '<br><br>//////////////////////////////////////////////////<br><br>';
  9.   
  10.   $xml_array = explode("\n", htmlspecialchars($xml));
  11.   $preg_array = array(array());
  12.   
  13.   foreach ($xml_array as $key=>$value) {
  14.     print $xml_array[$key].'<br>';
  15.     if(preg_match("<title>",$xml_array[$key])) $preg_array[][$title] = strip_tags(htmlspecialchars_decode($xml_array[$key]));
  16. //    if(preg_match("<description>",$xml_array[$key])) $preg_array[][$description] = strip_tags(htmlspecialchars_decode($xml_array[$key]));
  17.   }
  18.   
  19.   print '<br><br>//////////////////////////////////////////////////<br><br>';
  20.   
  21.   foreach($preg_array as $key => $value){
  22.     print $key.$preg_array[$key][0].'<br>';
  23.   }
  24.   print count($xml_array);

Re:Re:Re:Re:Re:PHPで複数サイトからRSSの取得

XMLのparseを自前でやることにあまり意味はない(車輪の再発明でしかない)ように思いますが、どうしても自前で解析したければ、下記のような感じでしょうか・・。

  1. $ct = 0;
  2.  
  3. $url = 'http://blog.example.com/rss'; 
  4. $rss = file($url);
  5.  
  6. $item = false;
  7. $site = '';
  8.  
  9. foreach ($rss as $value) {
  10.     $line = trim($value);
  11.     if (substr($line,0,5) == "<item") { $item = true; }
  12.     if (!$item) {
  13.         if (substr($line,0,7) == "<title>") { $site = strip_tags($value); }
  14.     }
  15.     else {
  16.         if (substr($line,0,7) == "<title>") {
  17.             $ct++;
  18.             $array[$ct]['site'] = $site;
  19.             $array[$ct]['title'] = strip_tags($value);
  20.         }
  21.         if (substr($line,0,13) == "<description>") {
  22.             $array[$ct]['description'] = strip_tags($value);
  23.         }
  24.     }
  25. }
  26.  
  27. foreach($array as $key=>$value){
  28.     print $key . '<br />';
  29.     print $value['site'] . '<br />';
  30.     print $value['title'] . '<br />';
  31.     print $value['description'] . '<br /><hr />' . PHP_EOL;
  32. }


>また、コメントにしている部分を外すと空白の分の配列ができ値がずれてしまいます。
>なぜなのでしょうか・・・?

値を入れているのが、$preg_array[][$title]と$preg_array[][$description]ですから・・。

こういうことはソースコードを地道に追っていけばわかるハズです(いわゆる机上デバッグ)。この作業が出来ない(問題を発見できない)ようだと困りますので、ソースコードの動きを追う練習をしてください。


(追記)
あ・・。元質問に追記が。それでは、私の書いたソースはお払い箱ですね(汗

流れをぶった切って元質問を編集するのは勘弁してください(というか、レスにも書いていただけるといいんですけどね)。

#MagpieRSSを使うのなら、RSSを提供する側でセットしているものは全部取得可能だと思います。
#「やってみればわかる」ことなので、試してください(var_dumpでもしてみればOK)。

Re:Re:Re:Re:Re:Re:PHPで複数サイトからRSSの取得

ご回答ありがとうございます。
流れをぶったぎってしまい申し訳御座いません。

よくわからないものを余り使いたくはない(ウイルス的なスクリプトがあったら怖い)ので
記載して頂きましたソースを使わせて頂きます。

貴重なお時間を割いて頂きありがとうございました。
またvar_dumpprint_rを試してみたのですが
値が確認できませんでした。

その為、このやり方では取得できないものだと思っておりました。

Re:Re:Re:Re:Re:Re:Re:PHPで複数サイトからRSSの取得

海外製にはよくあるよな・・・。
開発も2005年から止まってるんじゃない?
  1. <?php
  2. // rss_fetch.inc
  3. define('MAGPIE_OUTPUT_ENCODING''ISO-8859-1');
だから、マニュアルでXMLを参照と言ったのに。
file_get_contentsが使えるなら、PHP5でしょ。
XML処理なんて、むちゃくちゃ簡単じゃん。
http://php.net/manual/ja/function.simplexml-load-file.php

補足:
  1. <?php
  2. // $item_array は、ちゃんと初期化しておく。
  3. $item_array = array();
  4.  
  5. // これは、
  6. $site = 0;
  7. $item_array[$count][$site]
  8. // 以下でよい
  9. $item_array[$count]['site']
  10.  
  11. // もしくは、
  12. $item_array = array();
  13. $params     = array(
  14.   'site'        => '...',
  15.   'title'       => '...',
  16.   'description' => '...',
  17.   'link'        => '...',
  18.   'time'        => '...'
  19. );
  20. array_push( $item_array$params );

Re:PHPで複数サイトからRSSの取得

PEARやよそのサイトを見る前に、マニュアルで『XML』について調べる。
RSS取得は、すぐ解決すると思うけど・・・。

ついでに、関数かクラスオブジェクトの書き方も覚えよう・・・。
まさに今必要だろうし、ダラダラ長くなりそうなコードを説明に使用するのは不本意。

Re:Re:PHPで複数サイトからRSSの取得

ご回答ありがとうございます。
アドバイスありがとうございます。

関数については理解しております。
ただどの様にソースを書くかもわからないので
現段階では使わないで行っております。

関数を使わないで表現できたら
関数を使ったものに変更していく予定です。

クラスについても理解はしているのですが
こちらは自分では実装できそうにありません。
日本語の文字化け?について 質問一覧 データベースの登録方法について質問...