Amazonアフェリエイトへの道 #2 情報クエスト

2023年12月9日

アプリケーション

eyecatch Amazonのアフェリエイトリンクのクローリングができて、画像情報などが取れると分かったら、 次はクロールした情報からどこまでたくさんの情報が取れるかを調査してみたいと思います。

調査方法

基本的にはAmazonの商品ページに表示されている情報はほぼ取得できると考えていいかと思うので、商品ページを開いてデバッグコンソールでDOM構造を見つけていく作業になります。 それをPHPのDomParserで階層を掘りながら各種情報の値を取得して、取得できるできないの判定を行うという地道な方法で試してみたいと思います。

Amazon商品の情報たち

基本情報や必須情報から、あったらいいな情報までの判別も踏まえてリストアップしてみました。 前回PHPで取得したDomParseを$dom変数に格納してそこから情報をブッコ抜くコードを一緒に記載しておきます。

商品タイトル

必要度 : 絶対必要 商品タイトルが無いと何のリンクなのかわからないですからね。 最近のAmazon商品タイトルの特徴としては、仕様の説明などもたくさんの文字数で書かれている場合が多いので、タイトル情報でほぼ全ての商品説明ができてしまっているものが多いです。 function get_title($dom){ $title = $dom->getElementById("title")->textContent; return trim($title); } 商品タイトルは、titleというid値の情報を取得するだけなので、非常に楽に取得できます。

価格

必要度 : 絶対必要 価格は絶対に必要なんですが、なんちゃらフライデーや値引きイベントなどの際に値段が変動するので、本当はリアルタイムに表示したいんですが、とりあえずデータを取得した時点での価格を保持しておく仕様で考えます。 (リアルタイムに価格変動をするには、API仕様にしなければいけないので、別途検討したいと思います) function get_price($dom){ return $dom->getElementById("twister-plus-price-data-price")->getAttribute("value"); } 価格も比較的かんたんに取得できます。 inputタグの"twister-plus-price-data-price"というid値の中にあるvalue属性です。 ここでもうひとつ合わせて重要な値が、通貨の値(unit)です。 日本なら¥、アメリカなら$というような通貨の記号を値段につけないと、1ペソとかの値段が表示されていたら大変です。(そんなワケあるか!と思っても、必要最低限は行う必要があります) function get_unit($dom){ return $dom->getElementById("twister-plus-price-data-price-unit")->getAttribute("value"); } これも値段と近くのDOMに格納されているので、同じ方式で取得できてしまいます。

商品画像

必要度 : 絶対必要 商品画像は、アフェリエイトリンクで最も重要な要素です。 Amazonの商品ページには、メイン画像から小さな画像をクリックすると切り替えができてしまう、サムネイル画像などもあり、どういう構造になっているかは、DOMをじっくりと見て判断します。 確実に取得できるサムネイル一式方法で取得してみました。 function get_thumbnails($dom){ $arr = []; $ul_lists = $dom->getElementById("altImages")->getElementsByTagName("ul"); for($i=0; $i<count($ul_lists); $i++){ $li_lists = $ul_lists[$i]->getElementsByTagName("li"); for($j=0; $j<count($li_lists); $j++){ if($li_lists[$j]->getAttribute("src")){continue;} $class = $li_lists[$j]->getAttribute("class"); if(!$class){continue;} $classes = explode(" ",$class); if(!in_array("item" , $classes)){continue;} array_push($arr, $li_lists[$j]->getElementsByTagName("img")[0]->getAttribute("src")); } } return $arr; } 他にも、画像切り替え用の隠し画像が一式格納されているDOMがあったんですが、少し取得しずらかったので、サムネイル画像のURLを使って操作するようにしたいと思います。

商品動画

必要度 : あれば良いかも 動画は、上記のサムネイルで動画サムネイル画像は取得できるんですが、実際の動画は隠しDOMの中に格納されているようにも思えました。 (すみません、深く調査できていません) 今のところ必須ではないので、引き続き調査して、取得できれば、動画もURLで保持してリンクに反映してみたいと思います。

カテゴリ

必要度 : あれば良いかも 意外とあると良いと思ったのがカテゴリです。 書籍をはじめに、様々な生活用品や飲食品、専門工具からあらゆるパソコン・ガジェットなど、今では秋葉原に行くよりもamazonで全て揃えられる時代に突入しています。 そんな中、ジャンルなどの振り分けをするためのカテゴリは非常に役に立つ情報です。 でも、amazonのカテゴリって結構深い階層になっていたりするので、そのデータの取得方法は正直わかりませんでした。 でも、メインカテゴリのみであれば、以下のコードで取得できました。 function get_main_category($dom){ return $dom->getElementById("nav-subnav")->getAttribute("data-category"); }

商品説明文章

必要度 : あれば良いかも これも、絶対必要と、ちょっと必要の中間ぐらいの重要度なので、必須情報というわけではないのですが、調べていくうちに、商品ごとに特定の場所に決まった紹介文が書かれているワケではないということが判明しました。 また、商品説明と称して、説明書きが書かれている画像だけが表示されているパターンなどもあり、あまり有効なデータではないと判断したので、データ取得をするまえの検証に時間がかかりすぎると判断して、データ取得を諦めてしまいました。 今後法則性などがわかれば、再トライしてみたいと思います。

プライム商品バッジ

必要度 : あれば良いかも AmazonPrime商品なのかどうかって結構重要視する人もいると思うので、(自分は結構重要視しています)、このPrimeバッジを表示させたいと考えました。 Amazonの商品サイトでは、id="prime-badge"というタグ情報で獲得取得できるんですが、PHPで取得したHTMLにはこのタグが入っていないという事がわかりました。 要するにこれは、ページ表示後に、サイト内のJavascriptでprimeバッジ判定を行って表示しているのではないかと推測しました。 なので、今の段階では取得不可能でした。 ※これも今後の引き続き調査を行っていきたいと思います。

ASIN

必要度 : 無くてもいいかも Amazonの商品管理のIDとして、ASINという値が必要で、他のアフェリエイトリンクツールはこのASINの値を入力するパターンが多いようです。 これは、Amazonの提供するAPIで、ASIN値をセットする必要があるためだと思うんですが、今回のツールでは、正直いらんデータでもあります。 でも、簡単に取得できたので、とりあえず、取れるものは取っておきます。 function get_asin($dom){ return $dom->getElementById("ASIN")->getAttribute("value"); }

あとがき

各有、まだ取得できる情報があるかもしれませんが、とりあえずアフェリエイトリンクで必要な情報はこんなもんかな・・・と思っています。 後から取得できる情報があれば、追加していくというアジャイルな方式で開発を進めるのも悪くないでしょう。 評価の星数とか、評価コメントなんかあるともしかしたらいいのかもしれないですが、これも後回しにします。 他にも関連商品とか、類似商品とか姉妹商品など言い出したら・・・もはやECサイトを作っている感じになるので、これは簡易なアフェリエイトリンクですよ!と自分をストップさせました。