如何在InvokeWebRequest返回200状态码时提取URL并写入CSV
解决PowerShell中InvokeWebRequest 200状态码下提取最终着陆页的问题
核心解决思路
针对200状态码的场景,不要从Header读取URL(仅3xx重定向会返回Location头),而是利用InvokeWebRequest返回对象的ResponseUri属性获取HTTP层面的最终地址;如果需要移除查询字符串,用.NET的UriBuilder类做可靠处理;若页面存在JS/meta自动跳转,额外解析HTML内容提取跳转目标。
修改后的脚本示例
# 读取待测试URL列表 $urls = Get-Content "urls.txt" $results = foreach ($url in $urls) { try { # 发起请求,允许最多10次HTTP重定向 $response = Invoke-WebRequest -Uri $url -MaximumRedirection 10 -ErrorAction Stop $statusCode = $response.StatusCode $landingPage = $null $statusMessage = $null switch ($statusCode) { # 处理3xx重定向 { $_ -ge 300 -and $_ -lt 400 } { $landingPage = $response.Headers.Location $statusMessage = "Redirected" } # 处理200状态码,提取最终着陆页 200 { # 1. 获取HTTP请求最终到达的URI(包含所有HTTP重定向后的地址) $finalUri = $response.ResponseUri # 2. 移除查询字符串(按需选择) $cleanUriBuilder = [System.UriBuilder]$finalUri $cleanUriBuilder.Query = [string]::Empty $cleanFinalUrl = $cleanUriBuilder.Uri.AbsoluteUri # 3. 检查页面是否有meta自动跳转(比如电商常见的落地页跳转) $metaRefresh = $response.ParsedHtml.getElementsByTagName("meta") | Where-Object { $_.httpEquiv -eq "refresh" -and $_.content -match 'url=(.*)' } if ($metaRefresh) { $redirectUrl = $matches[1] # 处理相对URL转为绝对URL if (-not [Uri]::IsWellFormedUriString($redirectUrl, [UriKind::Absolute])) { $redirectUrl = [Uri]::new($finalUri, $redirectUrl).AbsoluteUri } # 同样移除跳转目标的查询字符串 $cleanRedirectBuilder = [System.UriBuilder]$redirectUrl $cleanRedirectBuilder.Query = [string]::Empty $landingPage = $cleanRedirectBuilder.Uri.AbsoluteUri } else { $landingPage = $cleanFinalUrl } $statusMessage = "Success" } # 处理4xx/5xx错误 { $_ -ge 400 } { $landingPage = "N/A" $statusMessage = "Error: $_" } } # 构造输出对象 [PSCustomObject]@{ "Original URL" = $url "Landing Page" = $landingPage "Status" = $statusMessage } } catch { # 处理请求异常(比如无法连接、超时等) [PSCustomObject]@{ "Original URL" = $url "Landing Page" = "N/A" "Status" = "Exception: $($_.Exception.Message)" } } } # 导出结果到CSV $results | Export-Csv -Path "landing_page_results.csv" -NoTypeInformation
关键知识点说明
ResponseUri属性:无论请求经历多少次HTTP重定向,该属性都会返回最终返回200状态码的页面URI,是200场景下获取最终地址的核心。UriBuilder处理URL:比手动字符串切割更可靠,能自动处理URL的各种格式(比如带端口、特殊字符的URL),确保移除查询字符串后URL仍然合法。- meta跳转解析:部分电商网站会在初始200页面通过meta标签触发自动跳转,通过解析HTML的meta标签可以捕获这类客户端跳转的目标地址。
内容的提问来源于stack exchange,提问作者Rajiv Ahmed
相关产品推荐
相关产品推荐

