2011-09-25 52 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