前回記事「VBAでブラウザを操作して作業を自動化してみよう -Amazon検索編 ①-」の続きとなります。
Amazonで商品を検索する処理は今回で完成となります。
ページ内の要素の場所を確認する
まずはHTMLソースを表示し、目的のタグがどこに存在するのかを確認します。
・・・しかし探すにしても、この何千行のソースの中から目的の1文を探すことはしたくないですよね。どのページを操作する場合にも共通しますが、探したい要素の前後に”特徴的な文字”が無いかどうかをまず探してみましょう。
なるべくそのページ内に1回しか出てこない文字などが望ましいです。
・・・今回はいい文字が無かったので、この「すべて」という単語で検索してみましょう。
早速目的の場所がヒットしました。カテゴリーの一覧も見えていることから、この部分の記述が検索カテゴリの指定を行う所と見て間違いないでしょう。
検索ワードの入力ボックスもこのすぐ後に記載されていると思います。
すぐに見つかりましたね。「type=’submit’」、「value=’検索’」となっているinputタグもありますので、恐らくこちらが検索ボタン。(データ送信などの処理を行うボタンには、”submit”指定が使われるのが一般的)
そのすぐ下にある「type=’text’」、「name=’field-keywords’」となっているものが入力ボックスです。
今は「value」の値が空欄になっていますので、この部分に検索したい文字列をセットしてみましょう。
入力ボックスに文字列をセットする
前回作成したツールでは「getElementsByTagName」を使用し、取得したタグ一覧をFor~eachで一つずつ確認するという方法を取りました。
今回のタグは「id」が指定されているので、この値を用いれば最初から目的のタグを特定することが可能です。
(※HTMLにおいてid値は、重複することの無い固有の識別名として設定されています)
その場合は「getElementById」を使用します。複数形の「Elements」では無い所に注意して下さい。
Option Explicit Const READYSTATE_COMPLETE = 4 Sub amazonSearch() ’AmazonページIEを取得 End Sub |
それでは前回作成した上記AmazonページIE取得後の処理に、以下のコードを追加してみましょう。
Set objLI = objIE.document.getElementById(“twotabsearchtextbox”) objLI.Value = “Microsoft” |
試しに実行してみると、検索ボックスに”Microsoft”と入力されます。
検索ボタンを押す
続けて検索ボタンを押してみましょう。
HTMLソースに戻り、検索ボタンに設定されているデータを確認します。idの項目はなく、「type」「class」「value」「tabindex」のみです。この場合は入力ボックスの様に一意に特定することはできませんので、For~eachを使ってクラス名の値に一致するタグを見つけていきます。
Set objInputTags = objIE.document.getElementsByTagName(“input”) For Each objInput In objInputTags On Error Resume Next sClassName = objInput.className On Error GoTo 0 If sClassName = “nav-input” Then objInput.Click Exit For End If Next |
クラス名の”nav-input”と一致した場合に「.Click」を行い、inputタグに対してクリックをした場合と同様の処理を行います。
上記処理を加えることで今回の目標動作は完了となります。
実際に動作をさせてみて下さい。”Microsoft”というキーワードで検索が行われていれば成功です。
今回は1回検索を行って終わりでしたが、ループさせて繰り返し何かを検索する。さらに前回作った処理とあわせてページ内の情報を収集しながら検索を繰り返す。といったツールも作れます。まさにウェブスクレイピングツールという感じですね。
しかし、短時間に連続でリクエスト(検索、更新などの要求を行い、その結果を得ること)を送信すると、相手のサーバーに負荷が掛かってしまいます。それによりサイトに繋がりにくくなったり、アクセスできなくなってしまうという事態にもなりかねません。
場合によっては損害賠償、刑事事件に発展する可能性もあります。リクエスト間隔を数秒に1回にするなど、負荷を掛けない仕様にすることを心掛けましょう。
こちらの事例(岡崎市立中央図書館事件 (別のタブで開きます))にもぜひ目を通しておいて下さい。
ちなみにAmazonはわざわざ上記方法で検索を繰り返さなくても、「API」というものを使えば簡単に商品の情報を取得することができます。AmazonAPIの使い方についてはいずれ紹介したいと思います。
今後の予定としては、「処理の頻度をコントールする処理」、「掲載されている画像を保存する処理」、「IE上で表示されるフォームやダイアログを操作する処理」などを扱ったツールを作成したいと思います。
【続編的なもの】
⇒商品ページからボタン一つで情報を取り込むVBAプログラムの作り方(Amazon編①)