IKEAに行ってきたのでスクレイピングしてみる。

IKEA港北に付き添いで行ってきました。付き添いと言っても野郎ですが(w。

シンプルで好感が持てるデザイン、さすが北欧家具だなと(でも今の自分の家には合わないな...それなりに広い所に住まなくては)。日本のメーカには真似できなさそう。

そして買い物の仕方が独特。ショールームにある家具の番号をメモしておいて、最後に米軍の武器庫のような巨大倉庫から家具の材料をカート(!)に入れるシステム(だから連れが必要)。買った材料は家に持ち帰って自力で組み立てる。

そんな訳で、IKEAの新製品情報をスクレイピングしてみました。

左の新製品情報ナビを辿って新製品一覧をとりました。さすが家具屋だけあって構造が奇麗、スクレイピングしやすいわ。

CSSセレクタ
my $domein = 'http://www.ikea.com';
my $url = 'http://www.ikea.com/jp/ja/catalog/news/range/';

my $scraper = scraper {
   process 'title','title[]' => 'TEXT'; 
   process 'div.productNavigation div.productItem span.prodName','products[]' => 
       scraper {
            process 'a','category'   => 'TEXT';
            process 'a','list'       => sub{
                                            my $cat_url = $domein.$_->attr_get_i('href');
                                            scraper {
                                               process 'div.productPadding ','data[]' =>
                                                    scraper {
                                                        process 'a','link'               => '@HREF';
                                                        process 'img','image'            => '@SRC';
                                                        process 'span.prodName','name'   => 'TEXT';
                                                        process 'span.prodDesc','dec'    => 'TEXT';
                                                        process 'span.prodPrice','price' => 'TEXT';
                                                    };
                                               result qw/data/
                                            }->scrape(URI->new($cat_url));
                                       };
      };
   result qw/title products/
}->scrape(URI->new($url));

print YAML::Dump($scraper);
XPathだとこんな感じ
my $domein = 'http://www.ikea.com';
my $url = 'http://www.ikea.com/jp/ja/catalog/news/range/';

my $scraper = scraper {
   process '//title','title' => 'TEXT'; 
   process '//div[@class="productNavigation"]//div[@class="productItem"]/span[@class="prodName"]','products[]' =>
       scraper {
            process '//a','category'   => 'TEXT';
            process '//a','list'       => sub{
                                            my $cat_url = $domein.$_->attr_get_i('href');
                                            scraper {
                                                process '//div[@class="productPadding"]','data[]' => 
                                                    scraper {
                                                        process '//a','link'                         => '@HREF';
                                                        process '//img','image'                      => '@SRC';
                                                        process '//span[@class="prodName"]','name'   => 'TEXT';
                                                        process '//span[@class="prodDesc"]','dec'    => 'TEXT';
                                                        process '//span[@class="prodPrice"]','price' => 'TEXT';
                                                    };
                                               result qw/data/
                                            }->scrape(URI->new($cat_url));
                                       };
      };
   result qw/title products/
}->scrape(URI->new($url));

print YAML::Dump($scraper);
出力
  - category: スウェーデンフード
    list:
      - dec: ダブルチョコクリスプ
        image: /PIAimages/74505_PE191681_S2.jpg
        link: /jp/ja/catalog/products/70124686
        name: DUBBLA CHOKLADFLARN
        price: \ 795
      - dec: オートクリスプ
        image: /PIAimages/66444_PE179371_S2.jpg
        link: /jp/ja/catalog/products/49650057
        name: HAVREFLARN
        price: \ 695

友人曰く「IKEAの店舗がこのまま増えていくとユニクロみたいになりそうだ」と。
なるほど、周りの家が自分と同じ家具ばっかりなのはちょっと嫌だな、恥ずかしいかも。