40手前の手習いで、cheerio-httpcliの使い方学習中です。
サンプルコードを読んで動作はなんとなく解ったので、次は欲しいデータを取得することで習熟していこうと思います。今回は、公開されたAmazonの欲しい物リスト(wish list)から、Amazonの商品管理コードであるasinを抜き出してみます。
欲しい物リスト(ウィッシュリスト)の構造
ウィッシュリストは、個々に一意のIDが振られているので(公開設定されているのであれば)ログイン不要で取得できます。例えば、私のウィッシュリストは下記のようなURLになっています。最後のランダムな英数字の部分が、ウィッシュリストのIDです。
ウィッシュリストの中身に目を向けてみると、1ページあたり25件づつ表示されます。リストが25件以上ある場合は、ページ番号のボタンで表示されジャンプすることができます。そして最終ページ以外は、「次へ」のボタンがクリックできるようになっています。
今回は、一覧中からリンクのaタグを取得し、その中のhref属性からasin、title属性からタイトルを取得します。そして、次のページがある場合は再帰的に取得するようにしてみます。
一覧中のaタグは複数あるのですが、h5タグの下のclassがa-link-normalのaタグを取るという指定の仕方が良さそうです。
「次のページ」は、xPathを取得すると、このような構造になっています。
//*[@id="wishlistPagination"]/span/div/ul/li[7]/a
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っぽい書き方でないので、皆さま是非添削してこう書くのだよと教えてください。
感想
ようやくやりたいことが、サクサクと書けるようになってきました。そろそろ本題に戻って、AWS Lambdaと連携してAPI化等の部分にも触れていこうと思います。
シリーズ目次:
Node.jsでスクレイピングするならば
AWS Lambdaでcheerio-httpcliを実行する
Node.jsのWebスクレイピングモジュール 『cheerio-httpcli』の使い方その1 cheerioでhtmlの要素指定
Node.jsのWebスクレイピングモジュール 『cheerio-httpcli』のサンプルソースを読み解く
See Also:
『Rubyによるクローラー開発技法』を書きました
アプリケーションエンジニア向けのAWS本を書きました
『Amazon Web Services パターン別構築・運用ガイド』を書きました