Private/Helper/Invoke-BenchmarkScraper.ps1
<#
Copyright © 2024 Integris. For internal company use only. All rights reserved. #> FUNCTION Invoke-BenchmarkScraper { <# .SYNOPSIS Scrapes benchmark data from specified domains. .DESCRIPTION This function retrieves and filters benchmark data from specified domains such as CPU, GPU, and hard drive benchmark sites. .PARAMETER Domain The domain to scrape data from. Valid values are "www.cpubenchmark.net", "www.videocardbenchmark.net", and "www.harddrivebenchmark.net". .PARAMETER Query The query string to filter results by name. .PARAMETER Limit The maximum number of results to return. .PARAMETER SortBy The property to sort results by. Default is "rank". .PARAMETER Order The order to sort results in. Default is "descending". .PARAMETER ItemId The ID of the item to filter results by. .EXAMPLE Invoke-BenchmarkScraper -Domain "www.cpubenchmark.net" -Query "Intel" -Limit 10 -SortBy "rank" -Order "ascending" .NOTES The function uses System.Net.Http.HttpClient to retrieve data and filters results based on user input. #> param ( [string]$Domain = "www.cpubenchmark.net", [string]$Query, [int]$Limit, [string]$SortBy = "rank", [string]$Order = "descending", [int]$ItemId ) Add-Type -AssemblyName System.Net.Http if ($Domain -notin @("www.videocardbenchmark.net", "www.cpubenchmark.net", "www.harddrivebenchmark.net")) { throw [System.ArgumentException]::new("Invalid domain given.") } $Url = @{ "www.cpubenchmark.net" = "https://www.cpubenchmark.net/CPU_mega_page.html" "www.videocardbenchmark.net" = "https://www.videocardbenchmark.net/GPU_mega_page.html" "www.harddrivebenchmark.net" = "https://www.harddrivebenchmark.net/hdd-mega-page.html" }[$Domain] $Session = New-Object System.Net.Http.HttpClient $Headers = @{ "referrer" = $Url "x-requested-with" = "XMLHttpRequest" "accept" = "application/json, text/javascript, */*; q=0.01" } $Session.DefaultRequestHeaders.Add("referrer", $Headers.referrer) $Session.DefaultRequestHeaders.Add("x-requested-with", $Headers."x-requested-with") $Session.DefaultRequestHeaders.Add("accept", $Headers.accept) $R1 = $Session.GetStringAsync($Url).Result $R1 | Out-Null $Url2 = "https://$Domain/data/?_=$([int](Get-Date -UFormat %s))000" $R2 = $Session.GetStringAsync($Url2).Result $Items = (ConvertFrom-Json $R2).data # Set Results to unfiltered Items value $Results = $Items # Apply user requested filters # Query by Name IF ($Query) { $Results = $Results | Where-Object { $_.name.ToLower() -like "*$($Query.ToLower())*" } } # Query by ItemId IF ($ItemId) { $Results = $Results | Where-Object { $_.id -eq $ItemId } } # Sort by Property and/or Order By ascending/descending IF ($SortBy -and $Order.ToLower() -eq "descending") { $Results = $Results | Sort-Object -Property $SortBy -Descending } ELSEIF ($SortBy) { $Results = $Results | Sort-Object -Property $SortBy } # Limit to # of Results IF ($Limit) { IF (($Results | Where-Object { $_.powerPerf -ne "NA" -and $_.powerPerf -ne "NA" -and $_.powerPerf -ne "NA"})) { $Results = $Results | Where-Object { $_.powerPerf -ne "NA" -and $_.powerPerf -ne "NA" -and $_.powerPerf -ne "NA"} | Select-Object -First $Limit } ELSE { $Results = $Results | Select-Object -First $Limit } } return $Results } |