2011-09-25 71 views
0

我正在構建一個Web抓取或爬蟲C#.NET應用程序,它不斷向服務器發送請求以收集一些信息。問題在於,對於特定服務器的某些網頁,Web響應總是404未找到。然而令人驚訝的是,我發現只要「Fiddler」正在運行,問題似乎就消失了,並且請求返回併成功響應。自從尋求答案以來,我一直在搜索網頁,但沒有找到答案。在更光明的一面,在搜索網絡並分析Fiddler的時間軸功能後,我得出了一些結論。在緩衝模式下模擬Cid中的提琴手請求#

1.Fiddler在我的應用程序使用流模式時使用緩衝模式加載這些網頁。 2.似乎Fiddler重用了連接,換句話說Keep-Alive被設置爲true。

現在的問題是我該如何模仿或模擬Fiddler在緩衝模式下加載Web響應的方式,以及Fiddler是否實際執行一些技巧(即修改響應)以獲得正確的響應。我使用HttpWebRequest和HttpWebResponse來請求我的頁面。在將數據返回給客戶端(這是我的服務器)之前,我需要一種完全緩衝httpwebresponse的方法。公共靜態字符串getCookie(字符串用戶名,字符串密碼) { HttpWebRequest request =(HttpWebRequest)WebRequest.Create(「certain link」);

 request.UserAgent = "Mozilla/5.0 (Windows NT 6.0; rv:6.0.2) Gecko/20100101 Firefox/6.0.2"; 


     request.Credentials = new NetworkCredential(username, password); 


     HttpWebResponse wr = (HttpWebResponse)request.GetResponse(); 
      String y = wr.Headers["Set-Cookie"].ToString(); 
      return y.Replace("; path=/", ""); 


    } 

    /// <summary> 
    /// Requests the html source of a given web page, using the request credentials given. 
    /// </summary> 
    /// <param name="username"></param> 
    /// <param name="password"></param> 
    /// <param name="webPageLink"></param> 
    /// <returns></returns> 
    public static String requestSource(String username,String password,String webPageLink){ 
     String source = ""; 

      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webPageLink); 


     if (username != null && password != null) 
     { 
      request.Headers["Cookie"] = getCookie(username, password); 


      request.UserAgent = "Mozilla/5.0 (Windows NT 6.0; rv:6.0.2) Gecko/20100101 Firefox/6.0.2"; 

      request.Credentials = new NetworkCredential(username, password); 
     } 
     StreamReader sr; 

     using (HttpWebResponse wr = (HttpWebResponse)request.GetResponse()) 
     { 
      sr = new StreamReader(wr.GetResponseStream()); 
      source = sr.ReadToEnd(); 
     } 



     return source; 
    } 
+0

FWIW,緩衝不是造成行爲改變的原因;還有其他事情正在發生。 FWIW,你真的需要從GetResponseStream返回的對象上調用.Close()。這讓很多人翹首以待。 – EricLaw

回答

0

你嘗試看看在HttpWebRequestAllowWriteStreamBuffering財產?您也可以嘗試將所有Fiddler的標題添加到您的請求中,以儘可能地接近Fiddler。

+0

其實我已經嘗試了這兩種可能的解決方案,但沒有任何結果.....是什麼讓我檢測到問題是httpwebrequest在流播模式下請求fiddler關閉時,是當默認情況下fiddler打開時請求成功因爲fiddler默認使用緩衝模式).....但是當我在fiddler中打開流模式選項時,它打開時,請求失敗,就像失敗時提琴手關閉! – user963991

+0

你是否嘗試連接在較低的水平上,使用TcpClient? –

+0

我該怎麼做? – user963991

0

難道是你的刮刀正在被檢測到並關閉,而提琴手放慢了它的速度,所以它不會被檢測到? http://google-scraper.squabbel.com/

+0

當我要求他們時,來自同一個主機的其他頁面可以正常工作.....並且其他不需要! – user963991

+0

奇怪的問題。 – kenny