You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

关键知识点说明

  1. ResponseUri属性:无论请求经历多少次HTTP重定向,该属性都会返回最终返回200状态码的页面URI,是200场景下获取最终地址的核心。
  2. UriBuilder处理URL:比手动字符串切割更可靠,能自动处理URL的各种格式(比如带端口、特殊字符的URL),确保移除查询字符串后URL仍然合法。
  3. meta跳转解析:部分电商网站会在初始200页面通过meta标签触发自动跳转,通过解析HTML的meta标签可以捕获这类客户端跳转的目标地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:05:27