その他

SeleniumBasicで自動スクロール(回数指定あり・なし)[No77]

投稿日:2020年10月27日 更新日:

スポンサーリンク

selenium Basic(VBA)で特定サイトを自動スクロール、スクレイピングする際のプログラムを用意してみましたのでご活用ください。

プログラム

早速プログラムの紹介です。一つのモジュールに次のを入れてください。


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についても書いてあります。

no image
【解決済】window.scrollTo(0, document.body.scrollHeight)が効かなくスクロールできない[No75]
通常、ブラウザ、サイトで「window.scrollTo(0, document.body.scrollHeight)」のスクリプトを実行するとスクロールしてくれます。 が、スクロー ...
no image
SeleniumBasicでボタン自動クリック(回数指定あり・なし)[No78]
プログラム 前回の以下記事のプログラムと同じ箇所が多くなります。ので以下記事のプログラムを用意いただき、以降紹介するようにしてください。 1.以下箇所は何度押しても良いボタンはないの ...

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

タグ

-その他

© 2021 BookALittle