【前回の記事】
⇒商品ページからボタン一つで情報を取り込むVBAプログラムの作り方(Amazon編①)
今回より実際に商品データの取得を行っていきます。
※記事中でサンプルとして扱っているAmazonのページは以下の商品です。
開く際はURLをコピーする等して、IEで開いておいて下さい。
【Nintendo Switch対応】マイクロSDカード32GB for Nintendo Switch
1.商品名を取得する
まずは商品名を取得してみましょう。
前回の処理で「MsgBox objIE.document.title」とすればそのページのタイトル名が取得できたと思います。
そこから「Amazon.co.jp」という文字列を取り除く・・・というやり方でも良いのですが、このタイトル部分の表記は「”Amazon.co.jp :” + 商品名 + “:カテゴリ名”」という構成になっています。
どちらも「:(コロン)」で区切られているため、Instr関数を使って「その前後を取り除く」という様な処理にしても良いのですが、仮に商品名にコロンが使われる場合におかしくなってしまいます。
そこまで考慮するのも面倒ですよね。
ということで、商品名が表示されているこちらの部分から取得します。
ソースコードを見ると「<span id=”productTitle” class=”a-size-large”>」となっていますね。id値が設定されていますので、「getElementById」でそのまま取得できそうです。
では、前回「MsgBox objIE.document.title」と記述していた部分を以下のものに変更して下さい。
MsgBox Trim(objIE.document.getElementById("productTitle").innerText)
これで余分な表記の無い、純粋な商品名が取得できたと思います。
確認できたら「MsgBox」の部分は「sProductName = 」に変更しておきましょう。
2.商品価格を取得する
続いて商品価格を取得しましょう。
先程取得した商品名の下にありますので、そこのソースを確認します。
<span id=”priceblock_ourprice” class=”a-size-medium a-color-price”>¥ 2,718</span>
この部分のタグが商品価格を表示していますね。id値も「priceblock_ourprice」というものが指定されていますので、先程と同じ様に処理を記述してみます。
MsgBox Trim(Replace(objIE.document.getElementById("priceblock_ourprice").innerText, "¥", ""))
商品価格には必ず「¥」が付いていますので、ここは固定で「¥」をreplace関数で取り除く処理を追加しています。
上記処理で商品価格が取得できることを確認できたら、忘れずに「Msgbox」の部分を「sProductPrice = 」に置き換えておきましょう。
横線で消されている「参考価格」については、いわゆる「メーカー希望小売価格」の様なものです。この部分はいらないので取得する必要は無いと思います。
割引率(OFF~の部分)も同様に不要だと思っていますが・・・希望があればコメント頂ければその部分も解説致します。
これで商品価格についても取得できましたが・・・
さて、ここで一つ気になることがありませんか?
今回サンプルにしている商品は「参考価格があってその下に販売価格が表示されています」が、商品によっては「参考価格が無く販売価格のみが表示されている」場合があります。
その場合はどうすれば良いでしょうか。そちらの商品のケースも確認しておきましょう。
id値は同じ「priceblock_ourprice」の様ですね。このパターンの表記でも同じ処理で商品価格は取れるみたいです。
幾つか商品を確認していた中で、唯一「セール価格」と表記されている商品のみid値が異なっていました。ただそんなに数も無いでしょうし、このケースはまぁ無視しておきます。
3.商品説明を取得する
商品ページには「製品情報」やら「登録情報」やら「商品の説明」等々、色々な情報が記載されていますが、今回はこちらの部分の内容を取得してみます。
価格等とあわせて目につきやすい場所なので、分かりやすく簡潔に必要な情報が纏められている場合が多いと思っています。
ではここもソース部分を確認してみましょう。
赤枠部分の<li>タグの内容を確認してみると、1行目の説明内容が記載されているのがわかりますね。この下に続いている<li>タグ4つは全て残りの商品説明になります。
でも今回は「li」タグ、「span」タグのいずれにもid値が設定されていませんね。
クラス名は設定されていますが、他の場所でも同じクラス名が使用されていた場合はどちらがこの部分の商品説明なのかが判断できません。
この場合はその少し前の部分のタグまで確認してみましょう。
すると「ul」、「div」と続いており、「div」タグのid値には「feature-bullets(直訳:特徴 – 箇条書き)」と書かれています。
つまりこの説明部分の内容はこの「div」タグの中に全て記述されているということですね。
試しにプログラムに以下の1行を追加して実行してみて下さい。
MsgBox Trim(objIE.document.getElementById("feature-bullets").innerText)
箇条書きされた説明文の内容が以下の様に全て表示されたと思います。
高速転送! Nintendo Switchに最適なマイクロSDカードです。
「Nintendo Switch」用のマイクロSDカード32GBモデルです。
ダウンロードデータなど、拡張ストレージとして有効です。Switch本体スペックに最適な高速転送モードに対応。ストレスなくデータ移動できます。
転送モード:SDR104対応 UHSクラスI スピードクラス10 読込80MB/s 書込15MB/s
書き込みテストに適合した任天堂公式ライセンス製品です。
これでも良いんですが、ちょっと見辛いですね。
Amazonの表記の様に各項目の頭に「●」を付けてみましょう。
Dim vTmp As Variant Dim iIdx As Integer '改行ごとに分割し、頭に「●」印を付けて再度結合させる vTmp = Split(objIE.document.getElementById("feature-bullets").innerText, vbCrLf) For iIdx = 0 To UBound(vTmp) If Trim(vTmp(iIdx)) <> "" Then sProductExplain = sProductExplain & "●" & Trim(vTmp(iIdx)) & vbCrLf End If Next MsgBox sProductExplain
「vTmp」と「iIdx」の宣言を追加し、下の部分の処理を追加して実行してみて下さい。
各箇条書きの説明の先頭に「●」が付き、分かりやすくなったのでは無いでしょうか。
ここまでのコード
ここまでのVBAコードは以下の通りです。
Option Explicit '----------------------------------------------------------------- '現在IEで開いているAmazonの商品ページの情報を、シート状に取得する '----------------------------------------------------------------- Sub main() Dim objIE As InternetExplorer 'Amazonの商品ページを格納 Dim sProductName As String '商品名 Dim sProductPrice As String '商品価格 Dim sProductExplain As String '商品説明 'IE取得関連 Dim objShell As Object 'shellオブジェクト格納 Dim objWindow As Object 'ウィンドウを格納 Dim vTmp As Variant Dim iIdx As Integer '---------Amazonのページを取得する処理--------- Set objShell = CreateObject("Shell.Application") For Each objWindow In objShell.Windows 'IEウィンドウの判定 If InStr(LCase(objWindow.FullName), "iexplore.exe") > 0 Then 'タイトルにAmazon.co.jpが含まれていれば商品ページと判定 If InStr(objWindow.document.title, "Amazon.co.jp") > 0 Then Set objIE = objWindow Exit For End If End If Next 'Amazonのページが見つからなかった場合の処理 If objIE Is Nothing Then MsgBox "商品ページの取得ができませんでした。" End End If '---------------------------------------------- sProductName = Trim(objIE.document.getElementById("productTitle").innerText) sProductPrice = Trim(Replace(objIE.document.getElementById("priceblock_ourprice").innerText, "¥", "")) '改行ごとに分割し、頭に「●」印を付けて再度結合させる vTmp = Split(objIE.document.getElementById("feature-bullets").innerText, vbCrLf) For iIdx = 0 To UBound(vTmp) If Trim(vTmp(iIdx)) <> "" Then sProductExplain = sProductExplain & "●" & Trim(vTmp(iIdx)) & vbCrLf End If Next End Sub
こちらのコードはただのサンプルですので、上記の様に記述しないと動かないという事はありません。
動きさえすれば書き方は自由ですので、自身のやりやすい様に記述して下さい。
次回は画像の取得と、幾つか他の部分の情報もおまけで取得してみます。
ではまた!
【次の記事】
⇒商品ページからボタン一つで情報を取り込むVBAプログラムの作り方(Amazon編③)