You need to enable JavaScript to run this app. 如何让Invoke-WebRequest通过Chrome自定义配置文件发起GET请求获取HTML
优惠活动
大模型
产品
解决方案
定价
更多

如何让Invoke-WebRequest通过Chrome自定义配置文件发起GET请求获取HTML

实现方案

方案1:使用Chrome远程调试模式获取页面内容(无需额外依赖)

直接复用你现有的Profile 1配置与登录态,不需要额外安装工具:

  • 给Chrome启动命令增加远程调试参数,后台启动并打开目标页面:
# 启动带远程调试能力的Chrome,用Profile 1打开目标$url
# 若Chrome版本低于112,可去掉--headless=new参数,会弹出可视窗口不影响结果
& "C:\Program Files\Google\Chrome\Application\chrome.exe" --profile-directory="Profile 1" --remote-debugging-port=9222 --headless=new $url
# 等待页面加载完成,可根据网络速度调整等待时长
Start-Sleep -Seconds 3
  • 调用调试接口获取完整的已登录状态页面HTML:
# 拉取调试接口数据匹配目标页面
$pageDebugInfo = Invoke-RestMethod http://localhost:9222/json | Where-Object { $_.url -eq $url }
# 通过WebSocket调试接口获取页面完整HTML
$ws = New-Object System.Net.WebSockets.ClientWebSocket
$cts = New-Object System.Threading.CancellationTokenSource
$ws.ConnectAsync($pageDebugInfo.webSocketDebuggerUrl, $cts.Token).Wait()
$evalCmd = [System.Text.Encoding]::UTF8.GetBytes('{"id":1,"method":"Runtime.evaluate","params":{"expression":"document.documentElement.outerHTML"}}')
$ws.SendAsync($evalCmd, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, $cts.Token).Wait()
$buffer = New-Object byte[] 1048576
$recvRes = $ws.ReceiveAsync($buffer, $cts.Token).Result
$respJson = [System.Text.Encoding]::UTF8.GetString($buffer, 0, $recvRes.Count) | ConvertFrom-Json
$html = $respJson.result.result.value
# 用完后关闭调试用Chrome进程
Get-Process chrome | Where-Object { $_.CommandLine -match '--remote-debugging-port=9222' } | Stop-Process -Force

拿到$html变量后即可直接解析判断商品购买状态。

方案2:导出Chrome配置中对应站点的Cookie给Invoke-WebRequest使用

不需要启动Chrome实例,直接读取Profile 1的Cookie数据传入请求:

# Profile 1的Cookie文件路径
$cookiePath = "$env:LOCALAPPDATA\Google\Chrome\User Data\Profile 1\Network\Cookies"
# 临时复制Cookie文件避免占用
Copy-Item $cookiePath -Destination "$env:TEMP\chrome_cookies.tmp" -Force
# 读取SQLite格式的Cookie文件
Add-Type -AssemblyName System.Data.SQLite
$conn = New-Object System.Data.SQLite.SQLiteConnection("Data Source=$env:TEMP\chrome_cookies.tmp;Version=3;")
$conn.Open()
$cmd = $conn.CreateCommand()
# 替换示例中的example.com为你目标站点的域名
$cmd.CommandText = "SELECT name, encrypted_value FROM cookies WHERE host_key LIKE '%example.com%'"
$reader = $cmd.ExecuteReader()
$cookieDict = @{}
while ($reader.Read()) {
    $name = $reader.GetString(0)
    $encryptedVal = $reader.GetValue(1)
    # 解密Chrome加密存储的Cookie,仅当前Windows用户可正常解密
    $decryptedVal = [System.Security.Cryptography.ProtectedData]::Unprotect($encryptedVal, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser)
    $cookieDict[$name] = [System.Text.Encoding]::UTF8.GetString($decryptedVal)
}
$conn.Close()
Remove-Item "$env:TEMP\chrome_cookies.tmp" -Force

# 构造请求会话传入Cookie
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$cookieDict.GetEnumerator() | ForEach-Object {
    $session.Cookies.Add((New-Object System.Net.Cookie($_.Key, $_.Value, "/", "example.com")))
}
$response = Invoke-WebRequest -Uri $url -WebSession $session
$html = $response.Content

方案3:使用自动化工具绑定Chrome配置(适合复杂页面场景)

如果页面有动态加载、交互逻辑,可使用Playwright绑定指定配置文件,稳定获取页面内容:

# 先执行安装:Install-Module Playwright; playwright install chrome
$playwright = [Microsoft.Playwright.Playwright]::CreateAsync().Result
$browser = $playwright.Chromium.LaunchPersistentContextAsync("$env:LOCALAPPDATA\Google\Chrome\User Data\Profile 1", @{
    Headless = $true
}).Result
$page = $browser.NewPageAsync().Result
# 可配置等待逻辑,直到页面指定元素加载完成
$page.GotoAsync($url).Wait()
$html = $page.ContentAsync().Result
$browser.CloseAsync().Wait()

内容的提问来源于stack exchange,提问作者Rasmus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 23:24:01