我写了一个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方法。我怎样才能知道发生了什么?
答案 0 :(得分:15)
可能是您的请求缺少服务器所需的标头。我在浏览器中请求了该页面,使用Fiddler记录了确切的请求,然后删除了User-Agent
标题并重新发出了请求。这导致了403响应。
这经常被服务器用来试图像你一样阻止他们网站的脚本; o)
在这种情况下,403响应中的服务器头是“AkamaiGHost”,表示来自Akamai的某些云安全解决方案的边缘节点。也许用于防止机器人的WAF规则正在触发403。
似乎向User-Agent
标头添加任何值都适用于此网站。例如,我将它设置为“绝对不是一个屏幕刮板”,这似乎工作正常。
通常,当您遇到此类问题时,使用浏览器工具或Fiddler等代理查看实际的HTTP请求和响应通常会有所帮助。正如Scott Hanselman所说
互联网不是黑匣子
http://www.hanselman.com/blog/TheInternetIsNotABlackBoxLookInside.aspx
答案 1 :(得分:12)
显然,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";
这确实有用。
答案 2 :(得分:1)
您的请求是否通过代理服务器?如果是,请在GetResponse()
来电之前添加以下行。
webRequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
答案 3 :(得分:1)
在我的特定情况下,它不是UserAgent标头,而是服务器不喜欢的Accept标头。
QLineEdit
您可以使用开发工具的浏览器网络标签查看正确的标题。
答案 4 :(得分:0)
您很可能无权访问您尝试访问的资源。因此,您需要获取必要的凭据才能完成所需的操作。