HttpWebRequest与浏览器请求
我曾经使用ac#program。(nseindia.com)从站点检索数据。但是最近NSE进行了一些更改,以便任何程序的任何请求都以“403 Forbidden Error”响应。 任何人都可以告诉我一种方法,使程序中的请求与浏览器中的请求相同。 我尝试设置userAgent属性,但那不起作用。 代码粘贴在下面。
string DownloadData(string CompanyName) { string address = string.Format(@"http://www.nseindia.com"); //http://www.nseindia.com/marketinfo/sym_map/symbolMapping.jsp?dataType=priceVolumeDeliverable&symbol=abb& //http://www.nseindia.com/content/equities/scripvol/datafiles/01-12-2008-TO-29-12-2010ABBALLN.csv HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address); request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3 string strData = ""; try { request.Proxy = WebProxy.GetDefaultProxy(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); System.IO.Stream stream = response.GetResponseStream(); System.Text.Encoding ec = System.Text.Encoding.GetEncoding("utf-8"); System.IO.StreamReader reader = new System.IO.StreamReader(stream, ec); strData = reader.ReadToEnd(); if (strData.Contains("Error")) { Exception e = new Exception(strData); throw e; } } catch(Exception e) { Console.WriteLine(e.ToString()); } return strData; }
尝试设置Accept
HTTP标头 ; 例如:
request.Accept = "Accept: text/html,application/xhtml+xml,application/xml";
我通过运行Fiddler2(在对另一个答案的评论中建议)来达到这个建议,以便了解我的浏览器(Firefox 4 Beta)如何向您提到的网站发出HTTP请求。
然后我在代码中设置所有标题并逐个删除。 一旦我删除了Accept
标头,就会返回403
状态代码。
我的浏览器提出的确切要求:
GET / HTTP/1.0 Host: www.nseindia.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0b8) Gecko/20100101 Firefox/4.0b8 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de,en;q=0.5 Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
PS:您在评论中提到的其他URI似乎无效。 一个是不完整的,产生500 Internal Server Error
,另一个产生404 Not Found
响应。
最好的办法是监视您的浏览器,以查看发送的请求和收到的响应。
根据您的浏览器,有许多插件。
尝试将凭据设置为默认值,如下所示
request.Credentials = System.Net.CredentialCache.DefaultCredentials;
要么
NetworkCredential nc = new NetworkCredential("user", "password"); request.Credentials = nc;
如果您需要用户名密码来访问该网页
或另一种选择是使用WebBrowser
控件;)