2013-03-09 67 views
0

我使用C#來下載網頁的HTML,但是當我檢查網頁的實際代碼和我下載的代碼時,它們完全不同。下面是代碼:下載網站的HTML返回的東西完全不同

public static string getSourceCode(string url) { 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
     req.Method = "GET"; 
     HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
     StreamReader sr = new StreamReader(resp.GetResponseStream()); 
     string soruceCode = sr.ReadToEnd(); 
     sr.Close(); 
     resp.Close(); 
     return soruceCode; 

     using (StreamReader sRead = new StreamReader(resp.GetResponseStream(), Encoding.UTF8)) { 

      // veriyi döndür 
      return sRead.ReadToEnd(); 
     } 

private void button1_Click(object sender, EventArgs e) { 

     string url = "http://www.booking.com/hotel/tr/nena.en-gb.html?label=gog235jc-hotel-en-tr-mina-nobrand-tr-com-T002-1;sid=fcc1c6c78f188a42870dcbe1cabf2fb4;dcid=1;origin=disamb;srhash=3938286438;srpos=5"; 
     string sourceCode = Finder.getSourceCode(url); 
     StreamWriter sw = new StreamWriter("HotelPrice.txt");//Here the code are completly different with web page code. 
     sw.Write(sourceCode); 
     sw.Close(); 

     #region //Get Score Value 

     int StartIndex = sourceCode.IndexOf("<strong id=\"rsc_total\">") + 23; 
     sourceCode = sourceCode.Substring(StartIndex, 3); 

     #endregion 
    } 
+0

什麼是代理標題是你發送。也許他們正在給你發送手機版本。 – 2013-03-09 03:02:47

+0

你的意思是不同的?有沒有奇怪的符號?或瀏覽器的html源碼和下載的字符串? – 2013-03-09 03:03:08

回答

0

最有可能爲差異的原因是,當你使用瀏覽器請求它是當你請求使用WebRequest的同一頁,其中未建立會話的一部分相同的頁面。

查看URL看起來像查詢參數sid是會話標識符或某種類型的隨機數。該頁面可能會驗證實際會話ID,當它確定它們不同時,會給你某種「Ooopss .. wrong seesion」類型的響應。

爲了模擬瀏覽器的請求,你必須確保你生成可能需要包括以下一個或多個正確的請求:

  • 餅乾(以前由Web服務器發送到您)
  • 一些特定的查詢參數(再根據頁面期望的內容)的有效/正確的用戶代理
  • 可能參照網址
  • 認證credenti ALS

,以確定你所需要的最好的辦法就是按照你的瀏覽器和服務從開始該頁面完成,準確地瞭解哪些請求頁面的Web服務器之間的談話,什麼樣的順序,哪些信息是來回傳遞。你可以使用WireShark或Fidler來完成 - 這兩個免費工具!

0

當嘗試使用HttpWebRequest來抓取頁面時,遇到了同樣的問題,並且頁面使用了ajax來加載我之後的所有數據。爲了獲得ajax呼叫,我切換到WebBrowser控制。

This answer提供了一個如何在WinForms應用程序之外使用控件的例子。在解析頁面之前,您需要連接瀏覽器的DocumentCompleted事件。被警告,這個事件可能會在頁面準備好被解析之前觸發多次。您可能要添加像這樣

if(browser.ReadyState == WebBrowserReadyState.Complete) 

到事件處理程序,知道什麼時候該頁面完全加載完畢。

相關問題