返回列表 上一主題 發帖

[分享] 轉換ie物件語法為Selenium(chrome) ?

[分享] 轉換ie物件語法為Selenium(chrome) ?

Sub IE345678()
    Set Ie = CreateObject("InternetExplorer.Application")
    Ie.Navigate "https://mis.twse.com.tw/stock/group.jsp?type=fixed&ex=tse&ind=TIDX#STATISTICS"
Do While Ie.Busy Or Ie.ReadyState <> 4: DoEvents: Loop
    Dim I As Integer, S As Integer, k As Integer, J As Integer
     Dim Element
    Set Element = Ie.document.getelementsbytagname("table")
    With Sheets("sheet1")
      .Range("a1:f17").ClearContents
        For S = 4 To 5               
            For I = 0 To Element(S).Rows.Length - 1
                k = k + 1
                For J = 0 To Element(S).Rows(I).Cells.Length - 1  
               .Cells(k, J + 1) = Element(S).Rows(I).Cells(J).innerText
                Next
            Next
        Next
    End With
    Set Element = Nothing
end sub

請教此ie物件如何轉換成Selenium(chrome)的語法?

回復 1# t8899


Sub test()
Set driver = CreateObject("Selenium.ChromeDriver")
driver.get "https://mis.twse.com.tw/stock/group.jsp?type=fixed&ex=tse&ind=TIDX#STATISTICS"  '如果卡在這裡 瀏覽器沒開成 要注意chromedriver版本是否更新
Set tb = driver.findelementsbytag("table")
Cells.ClearContents
For Each Z In tb
r = Cells(Rows.Count, 1).End(3).Row + 3
Z.astable.toexcel Cells(r, 1)
Next
End Sub

TOP

本帖最後由 t8899 於 2022-9-23 20:17 編輯

回復 2# singo1232001
謝謝指導,最後面需不需要 tb.quit ?? (像ie.quit)
如果只要table 3 , 語法是?

TOP

本帖最後由 t8899 於 2022-9-23 21:01 編輯

回復 2# singo1232001
上面的問題已找到答案

1.我如果只要 tb("6") 的第三欄第三列這個儲存的值(圖中黃色)的語法是?
2.執行時 隱藏chrome視窗的語法 ??

TOP

回復 4# t8899


    Set tb = driver.FindElementsByTag("table")(6)
MsgBox tb.FindElementsByTag("tr")(3).FindElementsByTag("td")(3).Text

TOP

回復  t8899


    Set tb = driver.FindElementsByTag("table")(6)
MsgBox tb.FindElementsByTag("tr ...
quickfixer 發表於 2022-9-23 23:53

謝謝指導
1 執行時 隱藏chrome視窗的語法 ??
2.只抓表格6的第二欄語法?

TOP

本帖最後由 singo1232001 於 2022-9-24 08:54 編輯

回復 6# t8899


    Sub test2()
Cells.ClearContents

Set driver = CreateObject("Selenium.ChromeDriver")
'driver.AddArgument ("headless") '無頭視窗
  'driver.Wait 1500 '沒有加等待1.5秒 會少一次網頁完成停頓 資料來不及近來 秒數依照電腦效能網路速度調整
    driver.get "https://mis.twse.com.tw/stock/group.jsp?type=fixed&ex=tse&ind=TIDX#STATISTICS"

Set tbl6 = driver.findelementsbytag("table")(6)    '<table> 第六個table
                  r = Cells(Rows.Count, 1).End(3).Row + 1
                     Cells(r, 1) = tbl6.findelementsbytag("th")(2).Text '<th> "整體市場的標題"

  Set tby1 = tbl6.findelementsbytag("tbody")(1)      '<tbody> 第一個tbody
    Set tr = tby1.findelementsbytag("tr")          '找到全部tr後  每個tr的第二個td

       For Each Z In tr
           r = Cells(Rows.Count, 1).End(3).Row + 1
          Cells(r, 1) = Z.findelementsbytag("td")(2).Text   'td第二
       Next
End Sub

擔心原po看不懂順序 (可以對照著網頁的標籤看)
另外不只這種標籤式的查找
也有其他種類的方法
只是這種比較不容易讓新手在網頁中迷路
當你練得很純熟的時候,可以像5樓q大那樣連著寫比較快

TOP

本帖最後由 singo1232001 於 2022-9-24 13:37 編輯

Sub 分解步驟版()
Cells.ClearContents
Set driver = CreateObject("Selenium.ChromeDriver")
    driver.AddArgument ("headless") '無頭視窗
    driver.Wait 1500
    driver.get "https://mis.twse.com.tw/stock/group.jsp?type=fixed&ex=tse&ind=TIDX#STATISTICS"

Set tbl6 = driver.findelementsbytag("table")(6)
  Set tby1 = tbl6.findelementsbytag("tbody")(1)
    Set tr2 = tby1.findelementsbytag("tr")(2)
      Set td2 = tr2.findelementsbytag("td")(3)
        Cells(1, 1) = td2.Text
End Sub


Sub 一氣呵成版()
Cells.ClearContents
Set driver = CreateObject("Selenium.ChromeDriver")
    driver.AddArgument ("headless") '無頭視窗
    driver.Wait 1500
    driver.get "https://mis.twse.com.tw/stock/group.jsp?type=fixed&ex=tse&ind=TIDX#STATISTICS"

Cells(1, 1) = driver.findelementsbytag("table")(6). _
               findelementsbytag("tbody")(1). _
               findelementsbytag("tr")(2). _
               findelementsbytag("td")(3). _
               Text
End Sub

'兩種寫法都一樣







'如果要加上完全自動更新
Sub Chrome更新時自動更新_and_分解步驟版()

Do
    On Error GoTo 0
    On Error Resume Next
    Set driver = CreateObject("Selenium.ChromeDriver")
        driver.AddArgument ("headless")
    Err = 0
    driver.Start
    If Err <> 0 Then
      If Exit5 > 5 Then Exit Sub  '若執行超過5次就不跑了
      driver.Quit
      Set driver = Nothing
      Exit5 = Exit5 + 1
      Call updataSelenium
    End If
Loop Until Err = 0
Set driver = Nothing




Cells.ClearContents
Set driver = CreateObject("Selenium.ChromeDriver")
    driver.AddArgument ("headless") '無頭視窗
    driver.Wait 1500
    driver.get "https://mis.twse.com.tw/stock/group.jsp?type=fixed&ex=tse&ind=TIDX#STATISTICS"

Cells(1, 1) = driver.findelementsbytag("table")(6). _
               findelementsbytag("tbody")(1). _
               findelementsbytag("tr")(2). _
               findelementsbytag("td")(3). _
               Text
End Sub

Sub updataSelenium()  '如果中途就跳離 可能是檔案位置要重新確認 或者 舊版本檔案沒刪除導致程序無法執行 也可能是壓縮檔解壓過程出問題 也可能是下載檔案出問題 主要F8逐步看哪段跳離
'找到chromedriver的檔案位置 有的電腦位置不同 通常是這兩個位置其一
'確認chromedriver正確的檔案路徑 與正確的資料夾路徑
path1 = "C:\Users\" & Environ$("username") & "\AppData\Local\SeleniumBasic\Chromedriver.exe"
path2 = "C:\Program Files\SeleniumBasic\chromedriver.exe"
If Dir(path1) <> "" Then TempDrvFile = path1
If Dir(path2) <> "" Then TempDrvFile = path2
foler = Left(TempDrvFile, InStrRev(TempDrvFile, "\"))

'查找電腦當前的google版本號
Set objHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")  'Get chrome version
chrversion = CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon\version")
dotsarr = Split(chrversion, ".")
leftchrver = dotsarr(0) & dotsarr(1)

'查找電腦當前的chromeDriver版本號
Set oShell = CreateObject("wscript.shell")
errcode = oShell.Exec(TempDrvFile & " --version").StdOut.ReadAll
verarr = Split(errcode, " ")
chrdrv = verarr(1)
dotsarr2 = Split(chrdrv, ".")
leftchrdrv = dotsarr2(0) & dotsarr2(1)
If leftchrver = leftchrdrv Then Exit Sub

'若不符 ,則上官網查最新chromeDriver版本號
Url = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_" & dotsarr(0)
Call objHttp.Open("GET", Url, False)
Call objHttp.Send("")
version_number = objHttp.responseText
dotsarr3 = Split(version_number, ".")
leftversion_no = dotsarr3(0) & dotsarr3(1)
download_url = "https://chromedriver.storage.googleapis.com/" + version_number + "/chromedriver_win32.zip"
    '利用最新的chromeDriver版本號 找到下載路徑
    Call objHttp.Open("GET", download_url, False)
    Call objHttp.Send("")
        
        '下載檔案,並更正成壓縮檔副檔名
        Set fileStream = CreateObject("ADODB.Stream")
        With fileStream
            .Open
            .Type = 1 'adTypeBinary
            .Write objHttp.responseBody
            .Position = 0
            .SaveToFile foler & "chromedriver.zip", 2
            .Close
        End With
        
        '解壓縮(解壓前程序會先刪掉舊的)
        On Error GoTo 0
        Set oApp = CreateObject("Shell.Application")
        If Dir(TempDrvFile) <> "" Then Kill TempDrvFile
        oApp.Namespace(foler).CopyHere _
            oApp.Namespace(foler & "chromedriver.zip").items
End Sub

TOP

本帖最後由 t8899 於 2022-9-24 14:03 編輯

回復 8# singo1232001
謝謝您熱心指導
我看程序執行完CHROME 會自動關閉(退出),不用再多  DRIVER.Quit ??

TOP

本帖最後由 singo1232001 於 2022-9-24 14:51 編輯

回復 9# t8899



若你不想關閉 可以這樣寫

Dim driver '<--這要置頂 最頂部 在這之上不能有任何字
Sub 不關閉分解步驟版()
Cells.ClearContents
Set driver = CreateObject("Selenium.ChromeDriver")
    'driver.AddArgument ("headless") '無頭視窗
    driver.Wait 1500
    driver.get "https://mis.twse.com.tw/stock/group.jsp?type=fixed&ex=tse&ind=TIDX#STATISTICS"

Set tbl6 = driver.findelementsbytag("table")(6)
  Set tby1 = tbl6.findelementsbytag("tbody")(1)
    Set tr2 = tby1.findelementsbytag("tr")(2)
      Set td2 = tr2.findelementsbytag("td")(3)
        Cells(1, 1) = td2.Text
End Sub

Sub 關閉子程序()
On Error Resume Next
If IsObject(driver) Then
driver.Quit
Set driver = Nothing
End If
End Sub

忘了說明
分解步驟版有個好處
就是可以多做 if isobject  + do loop+wait 判斷
另外不只可以判斷元素存在 也可以判斷值是否為空 或者判斷物件數量是否>1
避免有些網頁會慢慢才出現資料(這類網頁很常見 例如yahoo)

不過還有另外兩種類型也要小心
一種是 超出可視範圍外 會找不到元素(這種網頁不多)
一種是 要下拉網頁 才會跳出新元素(如FB)
這類網頁就要多花點功夫
通常國外論壇都有教 努力查 查的到

TOP

        靜思自在 : 布施如播種,以歡喜心滋潤種子,才會發芽。
返回列表 上一主題