2012-05-23 4 views
2
지금 경우 정상적인 page..but를 스크랩 할 때 내가 그것을 잘 작동 HttpWebRequest를

화면 아약스 요청

와 C#에서 근근이이 화면을 사용하여 페이지의 HTML을 얻으려고

을하는 페이지를 긁어 나는 아약스 요청에로드되는 페이지의 html을 얻으려고 노력한다. 문제가 생기면 ... 그 페이지를 얻으 려 할 때 보내는 두 가지 요청이있다 ..

정상 요청은 로그인을 우회한다

POST (http)://example/user/login?destination=/events/Sports HTTP/1.1 
Host: example 
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Referer: (http)://example/user/login?destination=/events/Sports 
Cookie: has_js=1; SESSee201d4242c83ea2671330cdceee4623=qdco8gukcm2pk9offdof1uv3a0 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 121 

name=Username&pass=Password&remember_me=1&form_build_id=form11cb87efa605eb9fb384eb9d2a2c686e&form_id=user_login&op=Go 

AJAX에서 데이터 가져 오기 요청

GET (http)://example/views/ajax?name=Sports&view_name=Events&view_display_id=page_1&view_args=Sports&view_path=events%2FSports&view_base_path=events&view_dom_id=1&pager_element=0 HTTP/1.1 
Host: example 
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0 
Accept: application/json, text/javascript, */* 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
X-Requested-With: XMLHttpRequest 
Referer: (http)://example//events/Sports 
Cookie: has_js=1; SESSee201d4242c83ea2671330cdceee4623=vd36esbpe8065snbfo39ubhmk3 
If-Modified-Since: Wed, 23 May 2012 08:13:51 GMT 

내 코드이 방법을 쓰기 시도했지만 작업 doesnt't 한 ..

string sid = String.Empty; 
string uri = "http://example/user/login?destination=/events/Sports"; 
string postData = string.Format("name=UserName&pass=Password&remember_me=1&form_build_id=form-11cb87efa605eb9fb384eb9d2a2c686e&form_id=user_login&op=Go"); 
byte[] postBytes = Encoding.UTF8.GetBytes(postData); 

//web request 

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri); 
req.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0"; 

req.KeepAlive = true; 

////set the cookie 
Cookie cookie = new Cookie(); 
cookie.Name = "Sports"; 

cookie.Domain = "SESSee201d4242c83ea2671330cdceee4623"; 
req.CookieContainer = new CookieContainer(); 
req.CookieContainer.Add(cookie); 

req.Headers.Add("Accept-Encoding", "gzip, deflate"); 
req.Headers.Add("Accept-Language", "en-us,en;q=0.5"); 
req.Method = "POST"; 
req.Host = "example"; 
req.Referer = "http://example/user/login?destination=/events/Sports"; 
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 

req.ContentType = "application/x-www-form-urlencoded"; 
req.ContentLength = postBytes.Length; 

//getting the request stream and posting data 
StreamWriter requestwriter = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII); 
requestwriter.Write(postData); 
requestwriter.Close(); 
string url = "http://example/views/ajax?name=Sports&view_name=Events&view_display_id=page_1&view_args=Sports&view_path=events%2FSports&view_base_path=events&view_dom_id=1&pager_element=0"; 

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
request.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0"; 
request.KeepAlive = true; 
request.Headers.Add("X-Requested-With", "XMLHttpRequest"); 
request.Headers.Add("Accept-Encoding", "gzip, deflate"); 
request.Headers.Add("Accept-Language", "en-us,en;q=0.5"); 
request.Host = "example"; 
request.Method = "GET"; 
request.Referer = "http://example//events/Sports"; 
request.Accept = "application/json, text/javascript, */*"; 

request.CookieContainer.Add(cookie); 
request.ContentType = "text/javascript; charset=utf-8"; 

try 
{ 
    HttpWebResponse res = (HttpWebResponse)request.GetResponse(); 
    StreamReader sr = new StreamReader(res.GetResponseStream()); 
    sid = sr.ReadToEnd().Trim(); 
} 
catch {} 

내가 문자열 SID에 { "status": false, "display": "", "messages": "" } 얻는 대신에 ..

사실 나에게 지위를주고 어떤 값을 표시해야

답변

4

각 요청에 대해 새로운 CookieContainer를 만들고 있으므로 로그인 요청이 세션 ID가 포함 된 쿠키를 반환한다고 가정하면 다음 요청에는 쿠키 컨테이너에 해당 세션 ID가 포함되지 않습니다.

//web request 

    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri); 
    req.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0"; 

    req.KeepAlive = true; 

    CookieContainer cookies = new CookieContainer(); 
    req.CookieContainer = cookies; 

    req.Headers.Add("Accept-Encoding", "gzip, deflate"); 
    req.Headers.Add("Accept-Language", "en-us,en;q=0.5"); 
    req.Method = "POST"; 
    req.Host = "example"; 
    req.Referer = "http://example/user/login?destination=/events/Sports"; 
    req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 

    req.ContentType = "application/x-www-form-urlencoded"; 
     req.ContentLength = postBytes.Length; 

    //getting the request stream and posting data 
     StreamWriter requestwriter = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII); 
     requestwriter.Write(postData); 
     requestwriter.Close(); 

     var firstResponse = req.GetResponse(); 
     using(var sr = new StreamReader(firstResponse.GetResponseStream()) { 
      sr.ReadToEnd(); 
     } 

     string url = "http://example/views/ajax?name=Sports&view_name=Events&view_display_id=page_1&view_args=Sports&view_path=events%2FSports&view_base_path=events&view_dom_id=1&pager_element=0"; 

     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
     request.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0"; 
     request.KeepAlive = true; 
     request.Headers.Add("X-Requested-With", "XMLHttpRequest"); 
     request.Headers.Add("Accept-Encoding", "gzip, deflate"); 
     request.Headers.Add("Accept-Language", "en-us,en;q=0.5"); 
     request.Host = "example"; 
     request.Method = "GET"; 
     request.Referer = "http://example//events/Sports"; 
     request.Accept = "application/json, text/javascript, */*"; 

     request.CookieContainer = cookies; 
     request.ContentType = "text/javascript; charset=utf-8"; 

    try 
    { 
     HttpWebResponse res = (HttpWebResponse)request.GetResponse(); 
     StreamReader sr = new StreamReader(res.GetResponseStream()); 
     sid = sr.ReadToEnd().Trim(); 
+0

을 didnt 작업, 개체의 인스턴스로 설정되지 않은 개체 참조 :

는 모두 같은 요청에 대한 CookieContainer, 즉를 사용합니다. –

+0

did not work, 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. –

+0

코드를 업데이트 할 수 있습니까? –