2010-12-31 5 views
2

C# 프로그램 (nseindia.com)을 사용하여 사이트에서 데이터를 검색하는 데 사용한 적이 있지만 최근에는 NSE에서 프로그램의 모든 요청에 ​​"403 Forbidden Error"로 응답하도록 일부 변경했습니다. 누구든지 프로그램에서 브라우저와 동일한 요청을하는 방법을 알려줄 수 있습니까? 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

다른 웹 사이트 (예 : http://www.google.com)에서 다른 URL을 요청하려 했습니까? 어쩌면 기업 정책이 변경되어 프록시를 사용하지 않고 직접 http 요청을 할 수 없게 될 수도 있습니다. –

+0

예. Google을 사용해 보았을 때 정상적으로 작동했습니다. 빠른 답장을 보내 주셔서 감사합니다. – Martin

답변

2

Accept HTTP 헤더를 설정해보십시오.; 예컨대 : (다른 대답 코멘트에 제안) 내가 (파이어 폭스 4 베타) 브라우저는 당신이 언급 한 웹 사이트에 HTTP 요청을 만드는 방법을보기 위해 Fiddler2를 실행하여이 제안에 도착

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

.

다음 코드의 모든 헤더를 설정하고 하나씩 제거했습니다. 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 응답을 산출합니다.

+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.co.kr/content/equity/scripvol/datafiles/01-12-2008-TO-29-12-2010ABBALLN.csv – Martin

0

봅니다이

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

또는

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

해당 웹 페이지

를 액세스하기 위해 사용자 이름 암호를 필요로하는 경우

또는 다른 옵션에처럼 기본적으로 자격 증명을 설정합니다 WebBrowser 컨트롤 사용)

+0

죄송합니다. – Martin

+0

Tiddles Fiddler, 멋진 도구 감사합니다. – Martin

3

가장 좋은 방법은 전송 된 요청과 응답을 정확히 보려면 ​​브라우저를 감시하는 것입니다.

브라우저에 따라 많은 추가 기능이 있습니다.

+0

나는 파이어 폭스에 대한 변조 데이터를 사용하여이를 시도했지만, 두 요청을 비교할 수 있도록 프로그램에서 보낸 요청을 어떻게 스파이 할 수 있습니까? – Martin

+1

스파이를 치기 위해 피 들러를 사용하십시오 - http://www.fiddler2.com/fiddler2/ –

+0

그것은 약간의 속임수입니다. localhost에서 www.nseindia.com을 가리 키도록 HOSTS 파일을 수정하고, SocketWorkbench와 같은 도구를 설정하여 포트 80에서 수신하고 www.nseindia.com의 실제 IP 주소로 릴레이 연결을 설정하십시오. 그게 전부 야. –