我编写了一个 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);
}
}
异常是在 GetResponse 方法中抛出的。我怎样才能知道发生了什么?
您的请求可能缺少服务器所需的标头。我在浏览器中请求该页面,使用 Fiddler 记录了确切的请求,然后删除了User-Agent
标头并重新发出请求。这导致了 403 响应。
服务器经常使用它来尝试阻止对其站点进行脚本编写,就像您所做的那样;o)
在本例中,403 响应中的服务器标头是“AkamaiGHost”,它表示来自 Akamai 的某些云安全解决方案的边缘节点。也许是防止机器人的 WAF 规则触发了 403。
似乎可以增加任何价值User-Agent
标题适用于该网站。例如,我将其设置为“绝对不是屏幕抓取器”,这似乎工作正常。
一般来说,当您遇到此类问题时,使用浏览器工具或 Fiddler 等代理查看实际的 HTTP 请求和响应通常会有所帮助。正如斯科特·汉塞尔曼所说
互联网不是黑匣子
http://www.hanselman.com/blog/TheInternetIsNotABlackBoxLookInside.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)