🎉
【備忘録】作業効率化のためのVBAとChromeでのWebスクレイピングに挑戦
はじめに
本記事は、作業効率化を目的に、VBAとChromeでWebスクレイピングに挑戦した際に、困ったことを解決策と、今後の課題などを記述した備忘録です。
背景
個人的な目的のため、あるサイトからコピペしてエクセルで資料を作成していたが、単純計算で15時間もかかることが分かったため、作業効率化と今後の活用のため、スクレイピングをすることとした。
技術選定
- VBA:スクレイピングというとpythonのようだが、pythonは未経験であること、エクセルで資料が作りたかったことと、VBAは多少使ったことがあることからVBAを選択。
- Chrome:もともと、参考書(Excel VBAでIEを思いのままに操作できるプログラミング術)より、IEで行うつもりだったが、項目を指定するXpathが便利そうだが、IEでの使い方が分からなかったため、Chromeに乗り換えた。なお、参考書は考え方自体は大変参考になった。
事前準備
VBAからChromeを操作するには、Selenium Basicとchromedriverが必要。
chromedriverは、自信が使用しているchromeと同じバージョンが必要。
また、.Net3.5も必要。
参考サイト
-「VBAのスクレイピングを簡単楽にしてくれるSelenium」
-「Selenium BasicからChromeが正常に起動できない時のメモ」
コーディング
'''vba
Sub scraping()
Dim driver As New Selenium.ChromeDriver '変数:driver でSelenium制御
Dim myBy As New By 'ByクラスはSelenium独自搭載のクラス
Dim siteURL As String '初期起動時に開くURL
Dim text As String 'スクレイピングしたテキストを格納する変数
Dim button As WebElement 'ページのボタン押下で使用
'Selenium利用時、ウィンドウサイズを最大化で開く初期設定
driver.AddArgument "disable-gpu"
driver.AddArgument "start-maximized"
For i = 2 To 11 '※1:定数(マジックナンバー)でループ行指定。2行目から11行目
Call driver.Start("chrome") 'chrome起動 ※2
'指定のURLに移動する
siteURL = "https://xxxxxx.php?id=" & Cells(i, 1).Value 'エクセルのA列からURLのパラメータ取得
driver.Get (siteURL)
WaitFor (3) '3秒待機。相手先に負荷をかけず、正常に開くのを待機するため
'ボタンを押下
Set buttonAnswer = driver.FindElementByXPath("//*[@id=""true""]") '※3
buttonAnswer.Click
WaitFor (1) '1秒待機
'ページから情報取得
text = driver.FindElementByXPath("//*[@id=""main_contents""]/section/ul/li[2]/a").Text '※4
'Excelに転記する
Cells(i, 2).Value = text
driver.Close 'chromeを閉じる
Next
End Sub
'''
課題
- ※1:ループする行を定数(マジックナンバー)で指定している。本当は自動で最終行を取得したかったがなぜか上手くいかなかったため妥協。要原因特定
- ※2:Chromeを開いたのち、ループしてページ遷移しながら情報を取得しようとしたが、2回目のループの途中でエラーが発生した。原因がわからなかったため、ループの都度、Chromeを再起動するようにしたらエラーは解消したが、リソースを多く使う気がするため、原因を特定し、再起動せずともループできるようにしたい。
- ※3:VBAからサイト上のJavaSqliptを実行する方法があるなら知りたい。分からなかったため、今回はボタンを選択し、クリックする方法で解決した。
備忘録
- ※4:XPathは便利。Chromeの開発者ツールで項目を指定し、右クリック>ペースト>XPathを指定するだけで、idが無くとも項目を一意に特定するパスを取得できる。同じ形式のページなら、使いまわせると思うので、スクレイピングにはうってつけと考える
Discussion