2010-12-31 16 views
2

私は、C#プログラム(nseindia.com)を使用してサイトからデータを取得するために使用しましたが、最近、NSEはプログラムからのリクエストに「403禁止されたエラー」が返されるようにいくつかの変更を行いました。誰でもプログラムからの要求をブラウザからの要求と同じにする方法を教えてもらえますか?私はuserAgentプロパティを設定しようとしましたが、動作していません。コードは下に貼り付けられます。HttpWebRequest対ブラウザリクエスト

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; 
} 
+0

別のWebサイト(たとえば、http://www.google.comなど)で別のURLをリクエストしようとしましたか?たぶん企業ポリシーが変更され、プロキシを使用せずに直接HTTPリクエストを行うことは許可されていない可能性があります。 –

+0

はい、私はそれがうまくいったGoogleを試みた。クイック返信ありがとうございます。 – Martin

答えて

2

Accept HTTPヘッダーを設定してみてください。例えば:

request.Accept = "Accept: text/html,application/xhtml+xml,application/xml"; 

私は私のブラウザ(Firefoxの4ベータ版は)あなたが言及したウェブサイトへのHTTP要求を行う方法を確認するために、Fiddler2をを(別の答えにコメントで提案されているように)実行することによって、この提案に到着しました。

次に、コード内のすべてのヘッダーを設定し、1つずつ削除します。 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が無効であると思われます。 1つは不完全であり、500 Internal Server Errorを生成し、もう1つは404 Not Found応答を生成します。

+0

よろしくお願い致します。他のuriは不完全でした。私は実際のものを含めました。 http://www.nseindia.com/marketinfo/sym_map/symbolCount.jsp?symbol=ABB http://www.nseindia.com/marketinfo/sym_map/symbolMapping.jsp?dataType=priceVolumeDeliverable&symbol=abb&segmentLink=3&symbolCount= 2&series = ALL&dateRange = day&fromDate = 01-12-2008&toDate = 29-12-2010 http://www.nseindia。com/content/equity/scripvol/datafiles/01-12-2008-TO-29-12-2010ABBALLN.csv – Martin

0

あなたは

または別のオプションそのWebページにアクセスするためのユーザー名・パスワードが必要な場合は、この

request.Credentials = System.Net.CredentialCache.DefaultCredentials; 

または

NetworkCredential nc = new NetworkCredential("user", "password"); 
request.Credentials = nc; 

などのデフォルトとしての資格情報を設定しようとはしていますWebBrowser制御;)

+0

申し訳ありませんが動作しませんでした。 – Martin

+0

試したフィドラー、素晴らしいツールありがとう。 – Martin

3

あなたの最良の賭けは、送信されたリクエストと受け取ったレスポンスを正確に見るためにあなたのブラウザを偵察することです。

ブラウザに応じて、多数のアドインがあります。

+0

私はfirefoxの改ざんデータを使ってそれを試みましたが、私は両方の要求を比較できるようにプログラムから送信された要求をどのようにスパイしますか? – Martin

+1

スパイするためにフィドラーを使用する - http://www.fiddler2.com/fiddler2/ –

+0

これはちょっとしたトリックです。 HOSTSファイルを変更して、www.nseindia.comをlocalhost上に置いたり、SocketWorkbenchのようなツールをポート80でリッスンしたり、www.nseindia.comの実際のIPアドレスに接続したりすることができます。それでおしまい。 –