返回列表 上一主題 發帖

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

回復 12# singo1232001

https://mis.taifex.com.tw/futures/disclaimer
這網頁進入按"接受"怎麼寫?

TOP

回復 10# singo1232001
請教我若同時要開第二視窗,要再增加 Set driver = CreateObject("Selenium.ChromeDriver")  這行 為
Set driver2 = CreateObject("Selenium.ChromeDriver")  ???

TOP

本帖最後由 singo1232001 於 2022-9-25 10:27 編輯

在你想找的網頁同一個位置
做兩次(按右鍵>檢查)

第一次是開啟 第二次是展開到你的元素

TOP

本帖最後由 t8899 於 2022-9-25 09:44 編輯

回復 10# singo1232001

請教看網頁原始碼?用什麼方法看,較容易找到標題??
/td /tr 這是一層一層???有無先後次序?如何快速知道要找的table 在第幾個??
找的技巧?

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

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

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

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

本帖最後由 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

回復  t8899


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

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

TOP

回復 4# t8899


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

TOP

        靜思自在 : 滴水成河。粒米成蘿,勿輕己靈,勿以善小而不為。
返回列表 上一主題