【VBA×Selenium】規則性のある要素を効率よく取得する方法
みなさんこんにちは。
Webスクレイピングをする際、
特定の要素を取得するのに直接HTMLのxPathを指定するかと思います。
内容によっては規則性があり、何度もxPathを指定しなおさなくても取得できる場合があります。
今回は、規則性のある内容に対して
効率良く要素を指定する方法について紹介したいと思います。
この記事はこんな人におすすめ
この記事はこんな人におすすめです!
- VBAプログラミング:初級者~中級者
- Webスクレイピング初学者
- コードだけサクッと取得したい人
- 効率の良いコードを書きたい人
といったところでしょうか。
規則性のある要素を効率良く指定するメリット
規則性のある要素を効率良く指定するメリットは以下のとおりです。
- コードの可読性向上
- 汎用性が高く他のサイトにも応用が利く
- Webスクレイピングの基本が定着する
といったところでしょうか。
スクレイピングをする際は、様々なサイトに対してスクレイピングを実施することが多いので、
一度やり方を覚えてしまえばかなり有効的なスキルになるかと思います。
目的/ゴール
今回はサンプルなので、YahooのTOP画面のニューストピックスを一括で取得することにします。
手順
1.Chromeを立ち上げる
2.ブラウザでYahooのTOP画面を開きデベロッパーツールを開く
この時、「Shift」+「Ctrl」+「C」を押すとショートカットで開くことができます。
3.取得したい要素にマウスカーソルを合わせ、左クリックを押します。
デベロッパーツールで該当の要素がハイライトされます。
4.ハイライトされた箇所で右クリック→Copy→Copy full xpathを選択する
取得したxpathは以下のようになりました。
/html/body/div[1]/div[1]/main/div[2]/div[1]/article/div/section/div/div[1]/ul/li[1]/article/a/div/div/h1/span
5.今度は、一つ下の要素を選択します。
もう一度「Shift」+「Ctrl」+「C」を押して、次の要素で左クリックします。
同様にxpathをコピーすると取得したxpathは以下のようになりました。
/html/body/div[1]/div[1]/main/div[2]/div[1]/article/div/section/div/div[1]/ul/li[1]/article/a/div/div/h1/span
/html/body/div[1]/div[1]/main/div[2]/div[1]/article/div/section/div/div[1]/ul/li[2]/article/a/div/div/h1/span ←今回取得分
6.3回ほど繰り返したら、一番最後の要素のXpathも取得します。
同様にxpathをコピーすると取得したxpathは以下のようになりました。
/html/body/div[1]/div[1]/main/div[2]/div[1]/article/div/section/div/div[1]/ul/li[1]/article/a/div/div/h1/span
/html/body/div[1]/div[1]/main/div[2]/div[1]/article/div/section/div/div[1]/ul/li[2]/article/a/div/div/h1/span
/html/body/div[1]/div[1]/main/div[2]/div[1]/article/div/section/div/div[1]/ul/li[8]/article/a/div/div/h1/span ←今回取得分
この時、添え字が変わっている箇所がありますが、
この添え字をFor文で繰り返せば完了です。
コードの紹介
コードは以下の通りになります。
'///////////////////////////////////////////////////////////////
' テストプログラム
'///////////////////////////////////////////////////////////////
Sub TestProgram()
Dim driver As New Selenium.WebDriver
Dim strXpath As String
Dim strBuff As String
Dim i As Long
' ブラウザを起動する
With driver
.Start "Chrome" 'クロームブラウザを立ち上げます。
.Get "https://www.yahoo.co.jp/"
' ここでニュースのタイトルを取得
For i = 1 To 8
strXpath = "/html/body/div[1]/div[1]/main/div[2]/div[1]/article/div/section/div/div[1]/ul/li[" & i & "]/article/a/div/div/h1/span"
Debug.Print .FindElementByXPath(strXpath).Attribute("innerText")
Next i
' ブラウザを閉じる
driver.Close
Set driver = Nothing 'driveをリセットする
MsgBox "終了しました。"
End With
End Sub
が、まだ完成ではありません。
実はVBEには数字の前に半角スペースが隠れています。
そのため、単純に数字をそのまま添え字として使用するとエラーが起こります。
なので、数字の前に半角スペースを削除するコードを実装する必要があります。
Replace(i, " ", "")
最終的には以下のようなコードになります。
Sub TestProgram()
Dim driver As New Selenium.WebDriver
Dim strXpath As String
Dim strBuff As String
Dim i As Long
' ブラウザを起動する
With driver
.Start "Chrome" 'クロームブラウザを立ち上げます。
.Get "https://www.yahoo.co.jp/"
' ここでニュースのタイトルを取得
For i = 1 To 8
strXpath = "/html/body/div[1]/div[1]/main/div[2]/div[1]/article/div/section/div/div[1]/ul/li[" & Replace(i, " ", "") & "]/article/a/div/div/h1/span"
Debug.Print .FindElementByXPath(strXpath).Attribute("innerText")
Next i
' ブラウザを閉じる
driver.Close
Set driver = Nothing 'driveをリセットする
End With
End Sub
debug.print で取得しているので、イミディエイトウィンドウには以下のように出力されます。
18日も危険な暑さ 午後は雷雨恐れ
総裁選に出馬意欲 推薦人の争奪に
安保理 2紛争首脳会合を開催へ
ハマス 見張りが命令背き人質射殺
JAL「成田→羽田」なぜ臨時運航
三笘薫 プレミア開幕戦でゴール
大社サヨナラ勝ち 泣いて走る打者
氷川きよしが再始動 感極まり涙
注意点
注意点は以下の通りです。
添え字の前には半角スペースが含まれるので、replaceを使用して必ず削除すること
“replace( i , ” ” , “”)” これは意外と見落としがちですのでご注意を!!
最後に
いかがでしたでしょうか。
スクレイピングの基本として、規則性のある要素を一括で取得する際は、
添え字をFor文で回して取得する方法についてご紹介させていただきました。
少しでもご参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、依頼したり、何か聞きたいことがあったりしたら
いつでもお気軽にご相談ください。
また、内容についてご不明点があればメッセージをいただけると幸いです。
Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!