ホーム>source

IEをロードし、WebページをスクレイピングしてからIEを閉じるコードがあります。

IEが開いているのを物理的に確認できるため、コードの実行に少し時間がかかると思います(間違っている場合は修正してください)。

問題は、IEを非表示にしてコードを実行したい場合です。情報を破棄した後、IEプロセスのそれぞれを終了するために最後に記述する必要はありません。 下記参照:

Set wb = CreateObject("internetExplorer.Application")
sURL = Cells(i, 10)
wb.Navigate sURL
wb.Visible = True
Do While wb.Busy = True Or wb.ReadyState <> 4: DoEvents: Loop
On Error Resume Next
      'scraping code here
wb.Quit
Set wb = Nothing
      'rest of the code here

したがって、wb.Visible = Falseの場合、wb.Quitは機能せず、IEがプロセスとして実行されていることを引き続き確認できます(もちろん、これは多くのメモリを使用し、メモリ不足により最終的にコードがクラッシュします)。プロセスを終了するには何を書く必要がありますか?それとも無意味な運動ですか?

ありがとうございました

あなたの答え
  • 解決した方法 # 1

    問題の要素に対してそのページに対してXMLTTPRequestを発行することはできません。

    そのため、その情報を取得する2つの方法があります。 2つ目は、クリックする方法を示しています。メソッドは、待機する方法、適切に閉じる方法、および適切に参照する方法を示します。


    方法1:Internet Explorer

    Public Sub GetInfo2()
        Dim IE As New InternetExplorer
        Const URL = "enter URL"
        Const WAIT_TIME_SECS As Long = 5
        With IE
            .Visible = False
            .navigate URL
            While .Busy Or .readyState < 4: DoEvents: Wend
            Dim t As Date, transactionCharge As Object
            t = Timer
            With .document
                Do
                    DoEvents
                    On Error Resume Next
                    Set transactionCharge = .getElementById("transaction_chargeP0Y")
                    On Error GoTo 0
                    If Timer - t > WAIT_TIME_SECS Then Exit Do
                Loop While transactionCharge Is Nothing
                If Not transactionCharge Is Nothing Then Debug.Print transactionCharge.innerText
            End With
            .Quit
        End With
    End Sub
    
    

    上記に、要素がすぐに利用できない場合に備えて、タイムアウト付きのループを含めました。


    方法2:Selenium Basic

    Selenium basicは、VB.Net、VBA、およびVBScript用のブラウザー自動化フレームワークです。

    これは、ヘッドレスブラウザインスタンスを実行する方法を示しています。

    セレンの明示的な待機機能を使用して、ページに要素が存在する時間を増やしました。また、セレンには暗黙の待機時間があります。

    以下のクリックイベントにより、2つの異なる展開可能なショー内訳セクションが開きます。

    最初は:

    関連するHTML:

    この行:

    .FindElementByCSS("[data-reveal-id='detailed-breakdown']", Timeout:=7000).Click
    
    

    CSSセレクターを使用して、ページ上のスタイル設定によって要素をターゲットにします。属性 data-reveal-id をターゲットにします  値 detailed-breakdown 。ザ・ウィズウィズ  属性セレクターを示します。

    2番目のクリックターゲットは次のとおりです。

    HTMLは次のとおりです。

    [] が表示されます  ターゲット可能なIDがあります。

    span
    
    

    コード:

    .FindElementById("brkdownInvstToggler", Timeout:=7000).Click
    
    

    参照(VBE> ツール> 参照):

    セレンタイプライブラリ


    サイドノート:

    ループする場合は、要素を Option Explicit Public Sub GetInfo() Dim d As WebDriver Set d = New ChromeDriver '< You can use IEDriver for Internet Explorer Const URL = "enterURL" With d .AddArgument "--headless" .Start "Chrome" .get URL .FindElementByCss("[data-reveal-id='detailed-breakdown']", Timeout:=7000).Click .FindElementById("brkdownInvstToggler").Click Debug.Print .FindElementById("transaction_chargeP0Y", Timeout:=7000).Text .Quit End With End Sub に設定することを忘れないでください  次のループラウンドの前。

    例えば。

    Nothing
    
    

    次に、次のURLを処理します。

    Set transaction_charge = Nothing

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ html - 要素のコレクションへのハイパーリンク