PHPでGoogleニュースの見出しを表示

(1/1)
Google ニュースを検索し、その結果の見出しのみを時間順・日付順に表示するプログラムを、PHP を使って作ってみることにする。
Google ニュースの検索設定だけでは時間順・日付順にすることができないようなので、このようなスクリプトを書いた。

サンプル・プログラム

プログラムを実行する

ダウンロード(PHP4/5共用)

サンプル・プログラムの解説:事前準備

0018: //ニュース・ソース
0019: $Sources = array('読売新聞','朝日新聞','毎日新聞','日本経済新聞','MSN産経ニュース','時事通信','47NEWS','ITmedia');
0020: 
0021: //1つのニュース・ソースあたりの検索件数
0022: $Numbers = 25;

まず、検索対象となるニュースソースを配列 $Sources に設定する。
各々のニュースソース毎の検索件数を変数 $Numbers に設定する。
この 2 つの変数は適宜変更していただいて構わない。

サンプル・プログラムの解説:検索URL作成

0041: /**
0042:  * GoogleNews検索URLを作成する(日付順ソート)
0043:  * @param string $query 検索キー
0044:  * @param string $source ニュース・ソース
0045:  * @param int $numbers 1つのニュース・ソースあたりの検索件数
0046:  * @return string 検索URL
0047: */
0048: function getURL_GoogleNewsSearch($query$source$numbers) {
0049:     $query  = urlencode($query);
0050:     $source = urlencode($source);
0051: 
0052:     return "http://news.google.co.jp/news?ned=tjp&hl=ja&as_q=&as_epq&as_oq={$query}&as_eq=&as_scoring=n&btnG=%E6%A4%9C%E7%B4%A2&as_drrb=q&as_qdr=w&as_minm=5&as_mind=28&as_maxm=6&as_maxd=27&as_nsrc={$source}&num={$numbers}";
0053: }

Google ニュースの検索URL を作成する。検索キーとニュース・ソースを指定した検索URL を作成する。
同時に複数のニュース・ソースを指定できないので、ユーザー関数 getURL_GoogleNewsSearch を何度か呼び出すことになる。

サンプル・プログラムの解説:記事の作成時刻

0055: /**
0056:  * 記事の作成時刻(UNIX TIME)を返す
0057:  * @param string $str 時刻の文字列
0058:  * @return int 作成時刻(UNIX TIME)
0059: */
0060: function getSourTime($str) {
0061:     $post = 0;
0062:     //分
0063:     if (preg_match("/‎([0-9]+) 分前‎/", $str$arr) > 0) {
0064:         $post = time() - $arr[1] * 60;
0065:     //日
0066:     } else if (preg_match("/‎([0-9]+) 時間前‎/", $str$arr) > 0) {
0067:         $post = time() - $arr[1] * 60 * 60;
0068:     //年
0069:     } else if (preg_match("/‎([0-9]+)年([0-9]+)月([0-9]+)日/", $str$arr) > 0) {
0070:         $post = mktime(000$arr[2]$arr[3]$arr[1]);
0071:     }
0072: 
0073:     return $post;
0074: }

冒頭に述べたように、Google ニュースでは記事の作成日時順に並べ替えることができないので、PHP スクリプトの中で並べ替えを行う。そのために、記事の作成日時を取得するのがユーザー関数 getSourTime である。
Google ニュースでは、記事の作成日時を「××分前」「××時間前」「×年×月×日」の 3種類で表示する。各々の場合を、UNIX TIME に統一して変換している。

サンプル・プログラムの解説:記事の解析

0076: /**
0077:  * GoogleNewsを解析する
0078:  * @param string $url GoogleNews URL
0079:  * @param int $start $itemsに格納開始する要素番号
0080:  * @param array $items 解析結果を格納する配列
0081:  * @return int $itemsに格納する次の要素番号
0082: */
0083: function analyzeGoogleNews($url$start, &$items) {
0084:     //URL、タイトルのパターン
0085:     $pat1 = "/(href=\")(.*)(\"[ ]*id=\"[A-Za-z0-9]+\">)(<span class=\"titletext\">.*)(<\/a>[ ]*<\/h2>)/u";
0086:     //ソースのパターン
0087:     $pat2 = "/<div class=\"sub\-title\"><span class=\"source[ A-Za-z0-9\-]+\">([^\/]*)<\/span>&nbsp;\- <span class=\"date[ ]*\">([^\/]*)<\/span><\/div>/u";
0088: 
0089:     $infp = fopen($url, 'r');
0090:     if ($infp == FALSE)     return FALSE;
0091: 
0092:     //コンテンツを1行ずつ読み込んで処理する
0093:     while (! feof($infp)) {
0094:         $s1 = fgets($infp);
0095:         $arr1 = preg_split("/\<h2 class=\"title\"\>/u", $s1);
0096:         if (isset($arr1[1])) {
0097:             foreach ($arr1 as $str) {
0098:                 $n1 = preg_match($pat1$str$arr2);
0099:                 if ($n1 == 0)   continue;
0100:                 $n2 = preg_match($pat2$str$arr3);
0101:                 if ($n2 == 0)   continue;
0102:                 //ソースを取り出す
0103:                 $items[$start]['url']    = $arr2[2];
0104:                 $items[$start]['title']  = strip_tags($arr2[4]);
0105:                 $items[$start]['source'] = $arr3[1];
0106:                 $items[$start]['time']   = getSourTime($arr3[2]);
0107:                 $start++;
0108:             }
0109:         }
0110:     }
0111:     return $start;
0112: }

Google ニュースの解析は、「PHP で URL上のコンテンツを読み込む」で紹介した方法と同じで、正規表現によって行っている。
space
Google ニュースの表示フォーマットは時々変更される。
もしサンプル・プログラムが正常に動作しないようだったら、各自においてこの部分を手直ししていただきたい。
(この項おわり)
header