レンダリング Web サイトの特定のフィールド/ラベルを Web スクレイピングするスクリプトを作成しようとしています。Web サイトは、Excel の列リストにある検索パラメーターを使用してレンダリングされます。成長する約20アイテム。vbscripts を Web スクレイプに使用する方法を調査した後、私が直面している問題は、これを 20 回実行しても壊れないということです。これが私のコードです。
エクセル列
1492565
1528417
1529041
1530688
1492038
1492319
1492972
1508824
1513351
1514724
1514750
1518526
1520627
1520706
1520979
1523367
1523563
スクリプト: メイン サブ (Excel の入力フィールドからユーザー/パスを取得し、特定の列の行を介してループを設定します。ループが機能するようになるまで、msgbox のみを吐き出します。次に、それを別の列に出力します。
Sub WebScraper()
'itg on mainWS start row 6, column 5
'itg status column column 19
'declare variables
Dim url As String
Dim ITGNUMBER As Long
Dim user As String
Dim pwd As String
'set variables
url = "https://website/itg/web/knta/crt/RequestDetail.jsp?REQUEST_ID="
Set oMainWS = ActiveWorkbook.Worksheets("MainWS")
Set oITGStatusWS = ActiveWorkbook.Worksheets("ITGStatus")
user = ""
pwd = ""
user = oITGStatusWS.ITGusername.Value
pwd = oITGStatusWS.ITGpassword.Value
If user = "" Or pwd = "" Then
MsgBox ("You must enter username/password before continuing")
Exit Sub
End If
'log in
Set objIE = FirstIEConnect(user, pwd)
'start row is 6
RowCounter = 58
ColumnCounter = 5
ITGStatusColumn = 16
Do Until IsEmpty(oMainWS.Cells(RowCounter, 5).Value)
'get ITG number
currentITGNumber = oMainWS.Cells(RowCounter, 5).Value
MsgBox (currentITGNumber)
'get remote status
currentITGStatus = getITGStatusFunction(objIE.Application, Str(currentITGNumber))
MsgBox (currentITGStatus)
'paste into column 19
'oMainWS.Cells(RowCounter, 19).Value = currentITGStatus
'increment counter
RowCounter = RowCounter + 1
currentITGStatus = ""
currentITGNumber = ""
Loop
quitIE (objIE.Application)
End Sub
サブにはquitIEオブジェクトのクリーニングがあり、ユーザーをログアウトするJavaScript関数があります。
Sub quitIE(obj As Object)
obj.Navigate ("javascript: closeChildWindowsAndLogout();")
obj.Quit
End Sub
Google からこのサブを取得し、IE オブジェクトの準備が整うまで待機していました。これは実際にはループで多く失敗します。On Do While IE.Busy:Loop。ただハングします。
Sub Wait(obj As Object)
Do While obj.Busy: Loop
Do While obj.readyState <> 4: Loop
Application.Wait (Now + TimeValue("0:00:01"))
End Sub
Web サイトにはログオンが必要です。user/pwd は最初のサブからのものです。Document.logon.UserName
このサブルーチンは、IE オブジェクトを作成し、ログオン ページに移動して、user/pwd をandに挿入しますDocument.logon.Password
。最後に提出します。
Function FirstIEConnect(user As String, pwd As String)
loginURL = "https://website/Logon.jsp"
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False
IE.Navigate loginURL
Wait (IE.Application)
With IE.Document.logon
.UserName.Value = user
.Password.Value = pwd
.submit
End With
Set FirstIEConnect = IE
End Function
これが実際の Web スクレイピング機能です。ユーザーは上から IE オブジェクトにログインする必要があります。num を url GET リクエストに入力して、特定のページをレンダリングします。最後responseText
に ElementID に基づいて取得します
Function getITGStatusFunction(obj, num)
On Error Resume Next
'set url and num
url = "https://website/RequestDetail.jsp?REQUEST_ID=" & num
obj.Navigate url
Wait (obj.Application)
responseText = obj.Document.getElementByID("DRIVEN_STATUS_ID").innerHTML
getStatusFunction = responseText
End Function
繰り返しますが、問題は、さまざまなサブルーチンや関数から IE オブジェクトを渡そうとすると、オブジェクト エラーが発生し続けることです。
期待: スクリプトで、一意の番号を含む Excel の列情報をループ処理する必要があります。これらの番号を 1 つずつ取得し、検索 URL に 1 つずつ追加します。ページが読み込まれたら、ElementID(DRIVEN_STATUS_ID)
. 最終的にその値を取得して別の列に出力します。