プログラマでありたい

おっさんになっても、プログラマでありつづけたい

cheerio-httpcliを使って、Amazonのほしい物リスト(Wish List)から商品コード(asin)を抜き出す

 40手前の手習いで、cheerio-httpcliの使い方学習中です。
サンプルコードを読んで動作はなんとなく解ったので、次は欲しいデータを取得することで習熟していこうと思います。今回は、公開されたAmazonの欲しい物リスト(wish list)から、Amazonの商品管理コードであるasinを抜き出してみます。


欲しい物リスト(ウィッシュリスト)の構造



 ウィッシュリストは、個々に一意のIDが振られているので(公開設定されているのであれば)ログイン不要で取得できます。例えば、私のウィッシュリストは下記のようなURLになっています。最後のランダムな英数字の部分が、ウィッシュリストのIDです。

http://www.amazon.co.jp/gp/registry/wishlist/3G4653SB32HMZ/

 ウィッシュリストの中身に目を向けてみると、1ページあたり25件づつ表示されます。リストが25件以上ある場合は、ページ番号のボタンで表示されジャンプすることができます。そして最終ページ以外は、「次へ」のボタンがクリックできるようになっています。
f:id:dkfj:20160518074522p:plainf:id:dkfj:20160518074531p:plain

 今回は、一覧中からリンクのaタグを取得し、その中のhref属性からasin、title属性からタイトルを取得します。そして、次のページがある場合は再帰的に取得するようにしてみます。
 一覧中のaタグは複数あるのですが、h5タグの下のclassがa-link-normalのaタグを取るという指定の仕方が良さそうです。
f:id:dkfj:20160518075615p:plain
 「次のページ」は、xPathを取得すると、このような構造になっています。

//*[@id="wishlistPagination"]/span/div/ul/li[7]/a

f:id:dkfj:20160518075626p:plain
id:wishlistPaginationから辿って、直前のliタグがa-lastというクラスを持っているaタグを取ってくるというやり方でできそうです。

cheerio-httpcliを使って、欲しい物リストを取得するコード



 下調べが出来たので、cheerio-httpcliを使って取得するコードを書いてみます。ここまで調べておけば、要素の取得は簡単にできます。

'use strict';

/**
 * Amazonのほしい物リスト(公開)からASINを取得
 *
 */


var client = require('cheerio-httpcli');

var base = 'http://www.amazon.co.jp';
var url = 'http://www.amazon.co.jp/gp/registry/wishlist/3G4653SB32HMZ/';

function getWishList(url) {
  //console.log('getWishList: '+url);
  client.fetch(url).then(function (result) {
    var $ = result.$;
    $('h5 .a-link-normal').each(function () {
      var element = $(this);
      var href = element.attr('href');
      var title = element.attr('title');
      var array = href.match(/(\/dp\/+)(.{10})/);
      var asin = array[2];
      if (asin) console.log(asin);
    });
    var next = hasNextPage($);
    if (next)  getWishList(base+next);
  })
};

function hasNextPage($){
  //console.log($('div[id=wishlistPagination] .a-last a').attr('href'));
  return $('div[id=wishlistPagination] .a-last a').attr('href');
};
getWishList(url);

 しかしまぁ、JavaScriptっぽい書き方でないので、皆さま是非添削してこう書くのだよと教えてください。