プログラム

エクセルVBAを使ってアマゾンのASINコードを取得する

スポンサーリンク

さて前回「エクセルVBAを使ったアマゾンのトップ画面操作」で説明したプログラムを使って今度は、アマゾンで検索した結果表示された商品のASINコードを取得したいと思います。

ASINコードは、 Amazonグループの独自のコードで書籍以外の商品を識別する10桁の固有番号です。 同じ商品は、どの国のamazonでも、同じASINコードで管理されています。


前回の検索方法で”キーワード”を例えば、“4Kテレビ” と入れてみましょう。
この画面から検索された商品のうち最初のもののASINコードを抜き出します。
前回と同じように「F12」キーを押して、IEに標準で実装されている[DOM Explorer]を起動します。


HTMLは随分と長いですが、どうやら商品説明をクリックするとリンクする<a>コマンドのhref属性の中にありそうです。いくつかのHTMLを眺めてみると、“dp/” または “dp%2F”に続く10桁の文字がASINコードとなるようです。ちなみに、”%2F”はURLエンコードした”/”を表します。

<a class="a-link-normal a-text-normal" href="/gp/slredirect/picassoRedirect.html/ref=pa_sp_atf_aps_sr_pg1_1?ie=UTF8&amp;adId=A3E36MB8XE4AOF&amp;url=%2FTCL-4K%25E5%25AF%25BE%25E5%25BF%259C%25E6%25B6%25B2%25E6%2599%25B6%25E3%2583%2586%25E3%2583%25AC%25E3%2583%2593-%25E3%2583%2589%25E3%2583%25AB%25E3%2583%2593%25E3%2583%25BC%25E3%2582%25AA%25E3%2583%25BC%25E3%2583%2587%25E3%2582%25A3%25E3%2582%25AA-2019%25E5%25B9%25B4%25E3%2583%25A2%25E3%2583%2587%25E3%2583%25AB-55C8%2Fdp%2FB07WYW9473%2Fref%3Dsr_1_1_sspa%3F__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26dchild%3D1%26keywords%3D4k%25E3%2583%2586%25E3%2583%25AC%25E3%2583%2593%26qid%3D1590215406%26sr%3D8-1-spons%26psc%3D1&amp;qualifier=1590215406&amp;id=7000584394847529&amp;widgetName=sp_atf" target="_blank">
<span class="a-size-base-plus a-color-base a-text-normal">TCL 55V型 4K対応液晶テレビ スマートテレビ(Android TV) サウンドバー(ドルビーオーディオ)搭載 ブラック 2019年モデル 55C8</span>
</a>

今回は、プログラムを始めに開示します。

  1. Dim htmlDoc As HTMLDocument
  2. Dim strLinkHTML As String
  3. Dim linkUrl As String
  4. Dim Asin As String
  5. Dim strTemp As String
  6. Dim objLink As IHTMLElement
  7. Dim dp_location As Long
  8. Dim strExpression As String
  9.     '検索対象部品が見つからなかったときの処置
  10.     For Each htmlDoc In objIE.document.getElementsByTagName("span")
  11.         strTemp = htmlDoc.innerText
  12.         If InStr(strTemp, "一致する商品") > 0 Or InStr(strTemp, "検索結果が") > 0 Then
  13.             MsgBox "検索対象品が見つかりません"
  14.             Exit Sub
  15.         End If
  16.      Next
  17.     'ASINを探す処理
  18.      For Each objLink In objIE.document.Links
  19.          If objLink.className = "a-link-normal a-text-normal" Then
  20.              strLinkHTML = objLink.outerHTML
  21.              ' "dp%2F"は"dp/"に文字変換しちゃいます。
  22.              strLinkHTML = Replace(strLinkHTML, "dp%2F", "dp/")
  23.              dp_location = InStr(strLinkHTML, "dp/")
  24.              If dp_location > 0 Then
  25.                  Asin = Mid(strLinkHTML, dp_location + 3, 10)
  26.                  linkUrl = objLink.href
  27.                  strExpression = objLink.innerText
  28.                  Dim messageNo As Integer
  29.                  messageNo = MsgBox(strExpression, vbOKOnly, Asin)
  30.                  Exit For
  31.              End If
  32.          End If
  33.      Next

 

まず冒頭に、検索結果で検索対象品が見つからなかったときの処置をいれます。
このときアマゾンのメッセージは以下の画面のような表示となります。

いろいろ試してみましたが、毎回、同じメッセージではなく、
「一致する商品はありませんでした。」「検索結果が・・・・」というようなメッセージが表示されるので、そのメッセージが表示された場合は"検索対象品が見つかりません"とメッセージボックスに表示し、ブログラムを終了します。

このメッセージは<span>~</span>要素に囲まれたHTMLに記載されていますので、HTML内に記述された<span>要素の全配列である
objIE.document.getElementsByTagName("span") を使って、それぞれの<span>要素をFor Each 文を使って、htmlDoc に代入してから作業を行います。

strTemp = htmlDoc.innerText
で文字列をstrTemp に代入し、"一致する商品"、"検索結果が" というNG文字が含まれていないかInStr関数を用いて検索しています。

NG文字が無かったばあいは、いよいよASINの取り出しに入ります。

“objIE.document.Links”は、HTML内の全リンクの配列です。それぞれのリンクをFor Each 文を使って、objLinkに代入してから作業を行います。

注意ポイント

[DOM Explorer]を使うと、イメージ写真と説明文の両方に似たようなリンク先の記載が見つかります。今回は、説明文の方のリンク先を選択するためにclass属性が以下のものだけを選択対象とします。
class="a-link-normal a-text-normal"

strLinkHTML = objLink.outerHTML でリンク先を含むテキストデータを取り出します。

お目当てのリンク先を見つけたらいよいよ、ASINコードを取り出します。
冒頭で説明した“dp/” または “dp%2F”に続く10桁の文字がASINコードとなるので、検索を一元化するために、
“dp%2F”  →  “dp/”
とReplace関数を使って変換してしまいます。
InStr関数を使って、“dp/”を検索し、検索結果をもとに“dp/”に連なる10桁の文字を取得する。

取得結果は メッセージボックスの タイトルに ASINコードを入れ、メッセージには商品説明を入れて表示させました。

応用するとエクラルのスプレッドシートと併せて、複数のASINコードを取得することも可能となります。

最後に全体のプログラムを以下に掲載します。

  1. Option Explicit
  2. Const READYSTATE_COMPLETE = 4
  3. Dim objIE As InternetExplorer
  4. Dim objElement As IHTMLElement
  5. Dim objInputTags As IHTMLElementCollection 'Inputオブジェクト配列、集合体
  6. Dim objInput As IHTMLElement 'Inputオブジェクト
  7. Dim class_name As String
  8. Dim htmlDoc As HTMLDocument
  9. Dim strLinkHTML As String
  10. Dim linkUrl As String
  11. Dim Asin As String
  12. Dim strTemp As String
  13. Dim objLink As IHTMLElement
  14. Dim dp_location As Long
  15. Dim strExpression As String
  16. Sub getASIN()
  17.     Set objIE = CreateObject("InternetExplorer.Application")
  18.     objIE.Visible = True
  19.     objIE.Navigate2 "https://www.amazon.co.jp/"
  20.     Do While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE
  21.         DoEvents '上記の条件が長時間不成立の時、ESCキーで停止できるように追記。
  22.     Loop
  23.     Set objElement = objIE.document.getElementById("twotabsearchtextbox")
  24.     objElement.Value = "4kテレビ" '"fjafjf;afi"
  25.     Set objInputTags = objIE.document.getElementsByTagName("input")
  26.     For Each objInput In objInputTags
  27.         On Error Resume Next 'エラーが発生するとエラーの発生した次の要素から処理
  28.         class_name = objInput.className
  29.         On Error GoTo 0 ' 1つ前で宣言したエラー無視を無効にする。
  30.         If class_name = "nav-input" Then
  31.             objInput.Click '見つけた! すかさずクリック
  32.             'IEが完全表示されるまで待機
  33.             Do While objIE.Busy = False
  34.                 DoEvents
  35.             Loop
  36.             Do While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE
  37.                 DoEvents '上記の条件が長時間不成立の時、ESCキーで停止できるように追記。
  38.             Loop
  39.             Exit For
  40.         End If
  41.     Next
  42.     '検索対象部品が見つからなかったときの処置
  43.     For Each htmlDoc In objIE.document.getElementsByTagName("span")
  44.         strTemp = htmlDoc.innerText
  45.         If InStr(strTemp, "一致する商品") > 0 Or InStr(strTemp, "検索結果が") > 0 Then
  46.             MsgBox "検索対象品が見つかりません"
  47.             Exit Sub
  48.         End If
  49.      Next
  50.     'ASINを探す処理
  51.      For Each objLink In objIE.document.Links
  52.          If objLink.className = "a-link-normal a-text-normal" Then
  53.              strLinkHTML = objLink.outerHTML
  54.              ' "dp%2F"は"dp/"に文字変換しちゃいます。
  55.              strLinkHTML = Replace(strLinkHTML, "dp%2F", "dp/")
  56.              dp_location = InStr(strLinkHTML, "dp/")
  57.              If dp_location > 0 Then
  58.                  Asin = Mid(strLinkHTML, dp_location + 3, 10)
  59.                  linkUrl = objLink.href
  60.                  strExpression = objLink.innerText
  61.                  Dim messageNo As Integer
  62.                  messageNo = MsgBox(strExpression, vbOKOnly, Asin)
  63.                  Exit For
  64.              End If
  65.          End If
  66.      Next
  67. End Sub

スポンサーリンク

-プログラム