2013-07-30 66 views
0

我有一個頁面來解析(刮),但首先我必須通過控制措施。
有一些控制號碼我設法計算,當我試圖通過POST方法參數傳遞這些控制號碼和其他東西時,我認爲頁面刷新自己並生成新的控制號碼,所以我計算出的不通過檢查,我無法訪問所需的頁面。網頁刷新http GET方法,計算參數和POST方法在C#

起初,我得到HtmlAgilityPack方法的頁面,並得到這些控制數字的值:

HtmlWeb web = new HtmlWeb(); 
HtmlDocument mainPage = web.Load(url); 
int controlNumber = FindControlNumber(); 

直路後,我試圖通過POST方法傳遞計算出的數字:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newUrl); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
string data = @"id=" + id + "&controlNumber=" + controlNumber; 
byte[] dataStream = Encoding.UTF8.GetBytes(data); 
request.ContentLength = dataStream.Length; 
Stream newStream = request.GetRequestStream(); 
newStream.Write(dataStream, 0, dataStream.Length); 
newStream.Close(); 
HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); 
StreamReader sr = new StreamReader(webResponse.GetResponseStream()); 
string html = sr.ReadToEnd(); 

但那麼不是導航到期望的頁面,而是在初始頁面顯示消息「錯誤的控制號碼」。

我在做什麼錯?

+0

controlNumber的值是什麼? – ChrisBint

+0

控制號碼是3位整數。我相信這是正確的計算。令我擔心的是,連接或會話過期等等,是什麼強制頁面重新加載和生成新的控制數字,這使得計算出的控制數值變老。 – dzukica

+1

你確定你傳遞的控制號碼真的有效嗎?如果它是刮,你確定沒有任何cookie或任何其他重要的標題,你錯過了?或者可能還有其他POST參數?這就是我所看到的,你的代碼對於獲取頁面內容似乎很好。 –

回答

0

真的,我唯一需要做的就是設置cookie並使用WebRequest和WebResponse代替HPA的HtmlWeb。
這裏的代碼工作:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     request.Method = "GET"; 
     request.KeepAlive = true; 
     CookieContainer cookies = new CookieContainer(); // instantiate cookie container 

     request.CookieContainer = cookies; 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     var stream = response.GetResponseStream(); 

     // Calculate control number... 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newUrl); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     string data = @"id=" + id + "&controlNumber=" + controlNumber; 
     byte[] dataStream = Encoding.UTF8.GetBytes(data); 
     request.ContentLength = dataStream.Length; 

     request.CookieContainer = cookies; 

     Stream newStream = request.GetRequestStream(); 
     newStream.Write(dataStream, 0, dataStream.Length); 
     newStream.Close(); 
     HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); 
     StreamReader sr = new StreamReader(webResponse.GetResponseStream()); 
     string html = sr.ReadToEnd();