スポンサーリンク
selenium Basic(VBA)で特定サイトを自動スクロール、スクレイピングする際のプログラムを用意してみましたので、もしよければご活用下さい。
プログラム
早速プログラムの紹介です。1つのモジュールに次のようなコードを入れて下さい。
Option Explicit
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'DoPage関数について
'--------------------------------------------------------------------------------------------------
'Const DoPage_CONSTMODENAME As String = "doNotDo" 'スクロール(クリック)しない
Const DoPage_CONSTMODENAME As String = "specify" 'スクロール(クリック)する(指定する(specify))
'Const DoPage_CONSTMODENAME As String = "notSpecified" 'スクロール(クリック)する(指定しない(notSpecified))
Const DoPage_CONSTTIMES As Integer = 5
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Const BROWSER_NAME As String = "chrome"
Const BROWSER_NAME As String = "MicrosoftEdge"
'Const BROWSER_NAME As String = "ie"
'Const BROWSER_NAME As String = "opera"
Public Sub ShowWebSite_DoTest()
'Selenium.ChromeDriver | Selenium.EdgeDriver | Selenium.IEDriver | Selenium.OperaDriver
'Selenium.FirefoxDriver | Selenium.PhantomJSDriver
Dim driver As New Selenium.WebDriver
'「Selenium.WebDriver」で定義したのならばBROWSER_NAMEを指定。
'「Selenium.WebDriver」以外ならばこの一行は不要
driver.Start BROWSER_NAME
driver.Get "http://www.yahoo.co.jp/"
driver.Window.Maximize
timeWait ("00:00:03")
Call DoPage(driver, DoPage_CONSTMODENAME, DoPage_CONSTTIMES)
MsgBox "End"
driver.Close
End Sub
'modeName:しない(doNotDo) する(指定する(specify) 指定しない(notSpecified))
Private Sub DoPage(ByVal driver As Selenium.WebDriver, ByVal modeName As String, ByVal Times As Integer)
If (StrComp("doNotDo", modeName, vbTextCompare) = 0) Then
Exit Sub
End If
timeWait ("00:00:03")
Dim LoopCount As Integer
LoopCount = 0
Dim doHeight_Before As Long
doHeight_Before = 0
Dim doHeight_Now As Long
doHeight_Now = driver.ExecuteScript("return document.documentElement.scrollHeight;")
Do While (doHeight_Before <> doHeight_Now)
LoopCount = LoopCount + 1
driver.ExecuteScript ("window.scrollTo(0, document.documentElement.scrollHeight);")
timeWait ("00:00:01")
Call CheckBrowser(driver)
doHeight_Before = doHeight_Now
doHeight_Now = driver.ExecuteScript("return document.documentElement.scrollHeight;")
If (StrComp("specify", modeName, vbTextCompare) = 0) And (Times = LoopCount) Then
Exit Do
End If
Loop
End Sub
Private Sub CheckBrowser(ByVal driver As Selenium.WebDriver)
Do While (StrComp("complete", driver.ExecuteScript("return document.readyState;"), vbTextCompare) <> 0)
'Debug.Print "CheckBrowser:" & Now & "_" & driver.ExecuteScript("return document.readyState;")
timeWait ("00:00:01")
DoEvents
Loop
End Sub
Private Sub timeWait(ByVal lengthOfTime As String)
Application.Wait Now() + TimeValue(lengthOfTime)
End Sub
プログラムの使用にあたって
コメント設定やコメントアウト等を利用し、プログラム実行前にDoPage関数で「スクロールしない」、「回数指定してスクロールする」、「スクロールできるまで無限にスクロールする」をセットしておきましょう。
上のプログラムの設定では5回スクロールします。
今回私が用意したこのプログラムは、「スクロールする毎にページを読み込んで、ロードする毎にページ内容が増えていくサイト」を想定しています。「スクロールする毎にページを読み込んで、ロードする毎にページ内容が増えていくサイト」は、負荷をかけないようにそのような設定になっていると思われます。その辺を考慮して頂き、プログラムを使うか使わないかは自己判断で決めて頂ければと思います。
関連記事
JavaScriptについても書いた記事もあるので、そちらもお時間のある方は是非、下記リンクから読んでみて頂けると嬉しいです。
-
window.scrollTo(0, document.body.scrollHeight)が効かなくスクロールできない時の解決策[No75]
通常、ブラウザやサイトで「window.scrollTo(0, document.body.scrollHeight)」のスクリプトを実行するとスクロールできますが、中にはスクロール ...
-
SeleniumBasicでボタン自動クリック(回数指定あり・なし)[No78]
プログラム 前回の記事で紹介したプログラムと同じ箇所が多くなります。 まだ前回の記事を読まれていない方は、是非下記リンクから一読して頂き、前回のプログラムを用意して頂いた上で、本記事 ...
雑記
今日10月27日は「テディベアズ・デー」です。特定非営利活動法人・日本テディベア協会が1998年に制定した記念日で、この日は第26代アメリカ大統領・ルーズベルトの誕生日でもあります。
ある日、ルーズベルト大統領が熊狩りに行き、同行していたハンターが小熊を追い詰め、とどめを刺してほしいと大統領に言ったところ、「瀕死の小熊を撃つのはスポーツマン精神に背く」とし、撃たずに終わったというエピソードから、熊のぬいぐるみにルーズベルト大統領の愛称だった「テディ」を付けたテディベアが生まれたそうです。
テディベアズ・デイは、そんなルーズベルト大統領の優しさにならって、大切な人にテディベアを贈り、気持ちを伝える日という意味が込められています。
日本のある企業では、毎年テディベアズ・デイにちなんだ限定の熊グッズが発売されるなどのイベントも催されています。誰かに想いを伝える素敵な記念日なので、テディベアズ・デイがいつか自分の背中を押してくれる時が来るかもしれませんし、是非覚えておきたいですね。
最後までお付き合いいただきありがとうございます!
この情報が誰かの役にたてれば幸いです。