Flex、AIR、Java、Androidなど

3月17日 2009

楽天のジャンル一覧を生成するPHPスクリプト

Posted by: tachibana In: プログラミング

Perl版はこちらにあったのですが、PHPでもできそうだったので勉強も兼ねて書いてみました。

上記サイト様には

実行すると、32697ジャンルもあって、エントリーに記述するのはキツイので2階層までで省略すると、

とあるのですが、今回私がやってみたところ39864個のジャンルが生成されました。間違いでなければ増えているのでしょう。まあかなり細かくジャンル分けされているようなので何かあれば追加されるような性格のようなものなのかもしれませんね。

実行したPHPスクリプトは以下。間違いだらけだと思いますのでお暇な方がいらっしゃいましたら教えて下さい(笑) PHPは業務レベルで使ったことがほとんどないのでかなり適当です(^^;

<?php

    $limit = 10000000;

    $baseUrl = "http://api.rakuten.co.jp/rws/1.11/rest?developerId=[YOUR_developerID]&operation=GenreSearch&version=2007-04-11&genreId=";
    $defaultNum = 0;

    $tree = Array();
    $c = new CategoryTreeGenerator($defaultNum);

    print_r($tree);

    $pointer=fopen("hoge.txt", "w+");
    flock($pointer, LOCK_EX);
    fputs($pointer, join("\n",$tree));
    flock($pointer, LOCK_UN);
    fclose($pointer);

    class CategoryTreeGenerator
    {
        function CategoryTreeGenerator($categoryNum)
        {
            global $tree;
            global $baseUrl;
            global $limit;
            $isLimitDecresed = false;

            $xReader=new XmlReader();
            $xReader->open($baseUrl.$categoryNum);

            $isParentExists = false;
            $isWaitingText = false;
            $isWaitingParentText = false;
            $isWaitingChild = false;
            $isWaitingGenreId = false;

            $resultArray = Array();
            $cur = "";
            $parentCategory = "";

            while($xReader->read())
            {
                switch($xReader->nodeType)
                {
                    case XmlReader::ELEMENT:
                        if(strcmp($xReader->name, "parent") == 0 || strcmp($xReader->name, "current") == 0)
                        {
                            $isParentExists = true;
                        }
                        else if(strcmp($xReader->name, "child") == 0)
                        {
                            $resultArray = Array();
                            $isWaitingChild = true;
                        }
                        else if(strcmp($xReader->name, "genreId") == 0 || strcmp($xReader->name, "genreName") == 0)
                        {
                            if(strcmp($xReader->name, "genreId") == 0)
                            {
                                 $isWaitingGenreId = true;
                            }

                            if($isParentExists)
                            {
                                $isWaitingParentText = true;
                                $isParentExists = false;
                            }
                            else if($isWaitingChild)
                            {
                                $cur = $xReader->name;
                                $isWaitingText = true;
                            }
                        }
                        else
                        {
                            $isWaitingParentText = false;
                            $isWaitingText = false;
                        }
                        break;
                    case XmlReader::TEXT:
                        if($isWaitingParentText)
                        {
                            if(!$isWaitingGenreId)
                            {
                                $parentCategory = $parentCategory.($xReader->value." > ");
                            }
                        }
                        else if($isWaitingText)
                        {
                            if($isWaitingGenreId)
                            {
                                $resultArray[$cur] = $xReader->value;
                            }
                            else
                            {
                                $resultArray[$cur] = $parentCategory.$xReader->value;
                            }
                        }
                        $isWaitingGenreId = false;
                        break;
                    case XmlReader::END_ELEMENT:
                        if(strcmp($xReader->name, "child") == 0)
                        {
                            if(!$isLimitDecresed)
                            {
                                $limit--;
                                $isLimitDecresed = true;
                            }

                            $str = "genreId=".$resultArray["genreId"].":::"."genreName=".$resultArray["genreName"];
                            if($limit > 0)
                            {
                                $c = new CategoryTreeGenerator($resultArray["genreId"]);

                                sleep(1);
                            }
                            array_push($tree, $str);
                        }
                        break;
                    default:
                        break;
                }
            }
        }
    }
?>

$limitを少なめに設定してテストしていた段階ではテキストファイルに出力できていたのですが、全てを取得してから出力しようとしましたができていませんでした。総取得には結局6~7時間はかかるのでやり直さず標準出力をマクロでいじってテキストファイルにしました。

重いですがDLは以下からどうぞ。でもご利用になって損害等が発生しても責任は持てませんので悪しからずご了承下さい。

genre.txt

EasyFreeAds Blog News Facebook Twitter Myspace Friendfeed Technorati del.icio.us Digg Google Yahoo Buzz StumbleUpon

Tags:

1 Response to "楽天のジャンル一覧を生成するPHPスクリプト"

1 | Maura

9月7日 2012 at 6:12 AM

Avatar

Educational Article! Good to see someone that knows what it is
all about and can also produce common sense content for us readers.

without doubt looking forward to your next post.

Categories

 

2017年9月
« 4月    
 123
45678910
11121314151617
18192021222324
252627282930  

About

Author: tachibana

  • ちょっとしたことはTwitterに書いています。こっちはアプリの公開等の時に更新されます。
  • 最近はもっぱらJavaとObjective Cです。AS3は飽きました。
  • スクリプト言語ではPerlが好きでしたが最近はGAE/Jで何でもやってます。
  • Linuxは自宅サーバー建てるのがやっとのレベルです。前の会社で何日も徹夜してやったのはいい思い出です。
  • アプリへのご要望などご意見等ありましたらお気軽にご連絡下さい。

Alternative content here