Files
004_comission/abc2022d/task1/ticket0002/LocalResults_aspx.bas
louiscklaw cd17b58401 update,
2025-01-31 19:19:02 +08:00

244 lines
7.9 KiB
QBasic

Attribute VB_Name = "LocalResults_aspx"
Option Explicit
Public Sub ScrapeLocalResults()
Dim COL_IDX_HORSE_NO As Integer
Dim COL_IDX_LAST_6_RUNS As Integer
Dim COL_IDX_COLOUR As Integer
Dim COL_IDX_HORSE As Integer
Dim COL_IDX_BRAND_NO As Integer
Dim COL_IDX_WT As Integer
Dim COL_IDX_JOCKEY As Integer
Dim COL_IDX_OVER_WT As Integer
Dim COL_IDX_DRAW As Integer
Dim COL_IDX_TRAINER As Integer
Dim COL_IDX_RTG As Integer
Dim COL_IDX_RTG_PLUS_MINUS As Integer
Dim COL_IDX_HORSE_WT_DECLARATION As Integer
Dim COL_IDX_WT_PLUS_MINUS_VS_DECLARATION As Integer
Dim COL_IDX_BEST_TIME As Integer
Dim COL_IDX_AGE As Integer
Dim COL_IDX_WFA As Integer
Dim COL_IDX_SEX As Integer
Dim COL_IDX_SEASON_STAKES As Integer
Dim COL_IDX_PRIORITY As Integer
Dim COL_IDX_DAYS_SINCE_LAST_RUN As Integer
Dim COL_IDX_GEAR As Integer
Dim COL_IDX_OWNER As Integer
Dim COL_IDX_SIRE As Integer
Dim COL_IDX_DAM As Integer
Dim COL_IDX_IMPORT_CAT As Integer
Dim not_used As Variant
On Error GoTo ErrorHandler
ResetCell
Dim race_date As String
Dim s_year, s_month, s_date, temp_new_date As String
race_date = Common.readCell("AE1")
s_year = Split(race_date, "/")(0)
s_month = Split(race_date, "/")(1)
s_date = Split(race_date, "/")(2)
temp_new_date = s_date & "/" & s_month & "/" & s_year
Dim s_race_date As String
s_race_date = Format(temp_new_date, "DD/MM/YYYY")
'ByVal race_date As String, race_num As String, row_offset As Integer, horse_count As Integer
Dim row_offset As Integer
row_offset = 0
' on error goto eh
On Error GoTo ErrorHandler
' Create a new instance of the WebDriver.
Dim driver As New WebDriver
' Set the path to the WebDriver executable.
Dim CURRENT_DIR As String
CURRENT_DIR = ThisWorkbook.Path
driver.SetBinary CURRENT_DIR & "\Chromium\Application\chrome.exe"
driver.AddArgument "--disable-blink-features=AutomationControlled --blink-settings=imagesEnabled=false"
' Start Chrome.
driver.Start "chrome"
Dim By As New By
' Navigate to a website.
' https://racing.hkjc.com/racing/information/Chinese/Racing/LocalResults.aspx?RaceDate=2024/04/20&Racecourse=ST&RaceNo=1
driver.Get "https://racing.hkjc.com/racing/information/Chinese/Racing/LocalResults.aspx?RaceDate=" & s_race_date & "&RaceNo=1"
' document.querySelectorAll('#racecardlist tbody tr')[2].textContent
Dim startCell As Range
Set startCell = Worksheets("Sheet1").Range("A3")
Dim hourse_number As String
Dim script_content, script_result As String
Dim hourse_table As Variant
' test if match result table found
Dim table_count, table_count_result As String
table_count_result = driver.ExecuteScript("{ return document.querySelectorAll('.performance').length }")
table_count = CInt(table_count_result)
' find max race_num
Dim max_race_num As Integer
script_content = "{" & _
" let all_a = {};" & _
" all_a = document.querySelectorAll('.top_races a');" & _
" return all_a?.item(all_a?.length-2)?.href?.split('=')[3] || 0;" & _
"}"
max_race_num = CInt(driver.ExecuteScript(script_content))
Dim i, j, k, l As Integer
Dim current_row As Integer
current_row = row_offset
For l = 1 To max_race_num
driver.Get "https://racing.hkjc.com/racing/information/Chinese/Racing/LocalResults.aspx?RaceDate=" & race_date & "&RaceNo=" & CStr(l)
script_content = "{" & _
"list_e = [];" & _
"document" & _
" .querySelector('.performance table')" & _
" .querySelectorAll('tr')" & _
" .forEach((e_tr, idx) => {" & _
" if (idx > 0) {" & _
" let temp = e_tr.querySelectorAll('td');" & _
" let temp_l = [];" & _
" temp.forEach(e => temp_l.push(e.textContent.trim()));" & _
" list_e.push(" & _
" [" & _
" temp_l.join(',')," & _
" temp[9].textContent.replace(/[\n| ]+/g, '_').slice(1,-1)," & _
" ].join(',')" & _
" );" & _
" }" & _
" });" & _
"return list_e.join('|||')" & _
"}"
script_result = driver.ExecuteScript(script_content)
hourse_table = Split(script_result, "|||")
Dim table_race_date, race_course, race_number, total_race_number, race_cource_desc As String
table_race_date = driver.ExecuteScript("{ return document.querySelector('div.raceMeeting_select')?.querySelectorAll('p')[0]?.querySelectorAll('span')[0]?.textContent.split(/ +/g)[1] || '-'}")
race_course = driver.ExecuteScript("{ return document.querySelector('div.raceMeeting_select')?.querySelectorAll('p')[0]?.querySelectorAll('span')[0]?.textContent.split(/ +/g)[3] || '-'}")
race_number = driver.ExecuteScript("{ return document.querySelectorAll('div.race_tab td')[0]?.textContent?.split(/\s\(/g)[0] || '-'; }")
total_race_number = driver.ExecuteScript("{ return document.querySelectorAll('div.race_tab td')[0]?.textContent?.split(/ /g)[3]?.replace(/[\(|\)]/g,'') || '-'; }")
race_cource_desc = driver.ExecuteScript("{ return document.querySelector('div.race_tab')?.querySelectorAll('td')[11]?.textContent || '-'; } ")
For i = LBound(hourse_table) To UBound(hourse_table)
Dim temp As Variant
temp = Split(hourse_table(i), ",")
startCell.Offset(current_row, 30).value = table_race_date
startCell.Offset(current_row, 31).value = race_course
startCell.Offset(current_row, 32).value = race_number
startCell.Offset(current_row, 33).value = total_race_number
startCell.Offset(current_row, 34).value = race_cource_desc
startCell.Offset(current_row, 37).value = temp(2)
startCell.Offset(current_row, 38).value = temp(3)
startCell.Offset(current_row, 39).value = temp(4)
startCell.Offset(current_row, 40).value = "'" & temp(7)
startCell.Offset(current_row, 41).value = temp(5)
startCell.Offset(current_row, 42).value = temp(6)
startCell.Offset(current_row, 35).value = temp(0)
startCell.Offset(current_row, 36).value = temp(1)
startCell.Offset(current_row, 49).value = "'" & temp(8)
startCell.Offset(current_row, 50).value = temp(11)
Dim temp_l As Variant
temp_l = Split(temp(12), "_")
For k = 0 To 5
If (k >= UBound(temp_l)) Then
startCell.Offset(current_row, 43 + k).value = "-"
Else
startCell.Offset(current_row, 43 + k).value = temp_l(k)
End If
Next k
current_row = current_row + 1
Next i
Dim num_of_horse As Integer
Dim race_row_end As Integer
race_row_end = current_row - 1
num_of_horse = UBound(hourse_table)
not_used = DisplaySectionalTime_aspx.ScrapeDisplaySectionalTime(driver, race_date, CStr(l), race_row_end - num_of_horse, num_of_horse)
Next l
GoTo Done
ErrorHandler:
MsgBox "hello error2"
MsgBox "Error: " & Err.Description
Done:
TidySheet
driver.Quit
End Sub
Function ResetCell()
Worksheets("Sheet1").Range("AE3:BF300").ClearContents
End Function
Function TidySheet()
Worksheets("Sheet1").Range("OK1:OK200").ClearContents
'widen column width
Worksheets("Sheet1").Range("AE3:BF300").Columns.AutoFit
' align text to center
Worksheets("Sheet1").Range("AE3:BF300").HorizontalAlignment = xlCenter
End Function
' write cell
Sub writeCell(cell_addres As String, value As String)
End Sub
Private Sub Take_ScreenShot_Desktop()
Dim utils As New utils
Dim driver As New ChromeDriver
driver.Get "https://en.wikipedia.org/wiki/Main_Page"
Dim img As Object
'take a screenshot of the desktop
Set img = utils.TakeScreenshot()
'save the image in the folder of the workbook
img.SaveAs ThisWorkbook.Path & "\sc-desktop.png"
driver.Quit
End Sub