PowerShell访问ABS公开数据URL返回403错误但浏览器可正常打开
问题原因
澳大利亚统计局(ABS)的服务器设置了请求头User-Agent校验规则,会拦截未携带标准浏览器UA的请求。
默认System.Net.WebClient发起请求时不会携带合法UA信息,因此被服务器判定为异常请求,返回403禁止访问错误。Firefox访问正常是因为浏览器会自动携带符合要求的UA字段。你在其他网站运行同脚本无报错,是因为绝大多数网站没有开启这类UA校验规则。
解决方案
方案1:为WebClient添加模拟浏览器的UA头
# 实例化WebClient对象 $webClient = New-Object System.Net.WebClient # 添加Firefox浏览器的User-Agent标识 $webClient.Headers.Add('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0') $targetUrl = 'https://stat.data.abs.gov.au/sdmx-json/data/ABS_BLDG_APPROVALS_LGA2020/1.1.1.110.LGA2020.20660+20740+20830+20910+21110+21180+21450+21610+21890+22170+22310+22490+22670+22750+23110+23270+23430+23670+24130+24210+24330+24410+24600+24650+24850+24970+25060+25150+25250+25340+25710+25900+26080+26170+26350+26490+26980+27070+27260+27350+27450.M/all?detail=Full&dimensionAtObservation=AllDimensions&startPeriod=2020-07&endPeriod=2021-09' # 建议补充.json后缀,方便后续识别文件格式 $savePath = 'C:\temp\test.json' $webClient.DownloadFile($targetUrl, $savePath) # 释放资源 $webClient.Dispose()
方案2:使用PowerShell原生Invoke-WebRequest cmdlet
该方法更适配PowerShell运行环境,代码更简洁:
$targetUrl = 'https://stat.data.abs.gov.au/sdmx-json/data/ABS_BLDG_APPROVALS_LGA2020/1.1.1.110.LGA2020.20660+20740+20830+20910+21110+21180+21450+21610+21890+22170+22310+22490+22670+22750+23110+23270+23430+23670+24130+24210+24330+24410+24600+24650+24850+24970+25060+25150+25250+25340+25710+25900+26080+26170+26350+26490+26980+27070+27260+27350+27450.M/all?detail=Full&dimensionAtObservation=AllDimensions&startPeriod=2020-07&endPeriod=2021-09' $savePath = 'C:\temp\test.json' Invoke-WebRequest -Uri $targetUrl -OutFile $savePath -UserAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0' -UseBasicParsing
注意事项
- 提前确认
C:\temp目录存在,若不存在可先执行New-Item -ItemType Directory -Path C:\temp -Force创建,避免因路径不存在报错 - 两种方案中的User-Agent可以替换为你本地实际使用的Firefox版本对应的UA值,兼容性更好
内容的提问来源于stack exchange,提问作者sams
相关产品推荐
相关产品推荐

