今回で初回のウェブスクレイピングツール編は最後になります。
前回から自分自身で作り上げたという方はぜひ答え合わせをして見て下さい。プログラミング全般に言えることですが、実装の方法は一つではありません。最初の内は動けばそれで良いと思います。
店舗名、料理種別を取得する
サイトのHTMLソースを確認して下さい。
前回店舗のデータが含まれている「li」タグ内のブロックを見つけましたが、今度は店舗名が記載されているタグを見つけましょう。
はい、ありました。
どうやら店舗名は<a>タグ、料理種別は<span>タグでそれぞれ囲まれている様です。それでは前回と同じ要領で目的のタグを取得していきましょう。
前回までのコードに、以下の変数宣言を追加して下さい。
Dim objAnchorTags As Object
Dim objAnchor As Object
Dim sRestaurantName As String
Dim sFoodKind As String
Dim sKeyword As String
IF判定の処理の中に、「li」タグを取得した以下の処理を記述します。
Set objAnchorTags = objListItem.getElementsByTagName(“a”) For Each objAnchor In objAnchorTags sClassName = “” On Error Resume Next sClassName = objAnchor.className On Error GoTo 0 Next If InStr(sClassName, “list-rst__rst-name-target cpy-rst-name”) > 0 Then |
うーん・・・似たようなコードを何度も書きたくないですね。無駄に長くなって非常に見辛い。関数化しても良いんですが、この店舗名と種別の表示はそれぞれブロックの一番上にありますよね。
じゃあこうしましょう。
sRestaurantName = Trim(objListItem.getElementsByTagName(“a”)(0).innerText) |
これは上に書いたループの処理と全く同じ結果を返します。出てくる場所が決まっているのであれば、(n)※n=任意の番号と指定することで○番目のデータの値をこの1行で取得することが可能です。
「タグがたくさんあって、何番目に出てくるか分からない」「レイアウトの仕様が頻繁に変更される」といった場合は頻繁にメンテナンスしなければいけませんので、この方法は使わない様にしましょう。
この方法を用いて料理種別の値も取得しましょう。
sFoodKind = Trim(objListItem.getElementsByTagName(“span”)(0).innerText) |
これで完了です。ブレークポイントを指定するなどして、値が取れているか確認してみましょう。
検索キーワードの取得
検索キーワードの場所を確認しましょう。
ありましたね。
「li」タグにちゃんと検索キーワードだと識別できる様なクラス名が設定されているので、そのまま「li」タグを抽出 ⇒ class名判定で取得という流れで良いと思います。
ではいつも通りキーワードのタグを取得するための変数宣言を行います。
Dim objLIChildTags As Object
Dim objLIChild As Object
以前宣言した「objListItemTags」、「objListItem」も統一するために名前を変えておくと良いかもしれません。
検索キーワード取得の処理を以下の様に記述して下さい。
Set objLIChildTags = objLI.getElementsByTagName(“li”) For Each objLIChild In objLIChildTags sClassName = “” On Error Resume Next sClassName = objLIChild.className On Error GoTo 0 ‘キーワードはカンマ区切りで格納 If InStr(sClassName, “list-rst__search-word-item”) > 0 Then sKeyword = IIf(sKeyword = “”, Trim(objLIChild.innerText), _ sKeyword & “,” & Trim(objLIChild.innerText)) End If Next |
追加し終わったらブレークポイントを設定し、正しく取得できているかどうかを確認してみましょう。
データの貼り付け
後はデータをシート上に貼り付けるだけです。
貼り付け行を管理する変数「lRow」を宣言し、以下の処理をIF内の最後の部分に記述しましょう。
Cells(lRow, 1).Value = sRestaurantName Cells(lRow, 2).Value = sFoodKind Cells(lRow, 3).Value = sKeyword lRow = lRow + 1 |
念のため、IF文の最初の箇所に各変数の初期化処理も書いておきましょう。
お疲れ様でした!これでスクレイピングツールは無事完成のはずです。
実行してみると以下の様にエクセル上にデータが出力されると思います。
構成は違えど考え方は一緒ですので、ぜひご自身のサイトなどで試してみて下さい。
また、今回は全ての処理を一つの関数内に書きましたが、何度も使う様な処理は共通化する癖をつけると後々役立つと思います。
次回のツールではデータ取得だけではなく、フォームへの入力、ボタン押下といった処理も行ってみたいと思います。
今回のコード
参考までに今回のVBAコードを記載します。
Option Explicit
Const READYSTATE_COMPLETE = 4 Sub main() |
※食べログサイトの仕様変更などにより、そのままコピーしても使用出来ない場合があります。その場合は現在のサイトを参考に適宜修正を行って下さい。