HttpWebRequest返回"(403)Forbidden"错误

nci*_*ite 9 c#

我写了一个xml抓取器来接收/解码网站上的xml文件.它主要工作正常,但它总是返回错误:

"远程服务器返回错误:(403)禁止."

对于网站http://w1.weather.gov/xml/current_obs/KSRQ.xml

我的代码是:

CookieContainer cookies = new CookieContainer();
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(Path);
webRequest.Method = "GET";
webRequest.CookieContainer = cookies;
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
{
    using (StreamReader streamReader = new StreamReader(webResponse.GetResponseStream()))
    {
        string xml = streamReader.ReadToEnd();
        xmldoc.LoadXml(xml);
    }
}
Run Code Online (Sandbox Code Playgroud)

抛出GetResponse方法就是例外.我怎么知道发生了什么?

Mik*_*win 18

可能是您的请求缺少服务器所需的标头.我在浏览器中请求了该页面,使用Fiddler记录了确切的请求,然后删除了User-Agent标题并重新发出了请求.这导致了403响应.

这通常被服务器用来试图阻止他们的站点编写脚本,就像你正在做的那样; o)

在这种情况下,403响应中的服务器头是"AkamaiGHost",它表示来自Akamai的某些云安全解决方案的边缘节点.也许用于防止机器人的WAF规则正在触发403.

似乎向User-Agent标题添加任何值都适用于此站点.例如,我把它设置为"绝对不是一个屏幕刮板",这似乎工作正常.

通常,当您遇到此类问题时,使用浏览器工具或Fiddler等代理查看实际的HTTP请求和响应通常会有所帮助.正如Scott Hanselman所说

互联网不是黑匣子

http://www.hanselman.com/blog/TheInternetIsNotABlackBoxLookInside.aspx


sst*_*tan 13

显然,URL适用于浏览器.它只是从代码中无效.看起来服务器正在接受/拒绝基于用户代理的请求,这可能是尝试阻止爬虫的一种非常基本的方式.

要通过,只需将UserAgent属性设置为它将识别的内容,例如:

webRequest.UserAgent = @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36";
Run Code Online (Sandbox Code Playgroud)

这确实有效.