2011-09-25 1 views
0

일부 정보를 수집하기 위해 서버에 요청을 계속 전송하는 웹 스크래핑 또는 크롤러 C# .NET 응용 프로그램을 구축 중입니다. 문제는이 특정 서버의 특정 웹 페이지에 대해 웹 응답이 항상 404 찾을 수 없다는 것입니다. 그러나 놀랍게도 필자는 "피들러"가 작동하는 한 문제가 사라지고 요청이 성공적인 응답으로 반환된다는 것을 발견했습니다. 나는 대답을 찾고 나서 웹을 찾고 있었지만 아무것도 발견하지 못했습니다. 밝은면에서, 웹을 검색하고 Fiddler의 타임 라인 기능을 분석 한 후에 나는 결론에 도달했습니다.C#의 버퍼링 모드에서 피들러 요청 시뮬레이션

1.Fiddler는 응용 프로그램이 스트림 모드를 사용하는 동안 버퍼 모드를 사용하여 이러한 웹 페이지를로드합니다. 2. Fiddler가 연결을 다시 사용하는 것으로 나타나거나 Keep-Alive라는 단어가 true로 설정되었습니다.

이제 질문은 Fiddler가 버퍼 모드에서 웹 응답을로드하는 방법과 Fiddler가 실제로 응답을 수정하여 응답을 수정하는지 여부를 모방하거나 시뮬레이션 할 수 있습니다. 나는 내 페이지를 요청하기 위해 HttpWebRequest와 HttpWebResponse를 사용하고있다. 클라이언트 (내 서버)에 데이터를 반환하기 전에 httpwebresponse를 완전히 버퍼링하는 방법이 필요합니다.

공공 정적 문자열의 getCookie (문자열 이름, 문자열 암호) { 의 HttpWebRequest 요청 = (HttpWebRequest를)이 WebRequest.Create ("특정 링크");

 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가 스트리밍 모드에서 요청하는 것을 감지하게 만들었습니다. 피들러가 꺼져있을 때 기본적으로 피들러가 열리면 요청이 성공합니다. 피들러는 기본적으로 버퍼링 모드를 사용하기 때문에 .....)하지만 피들러가 열려있을 때 스트리밍 모드 옵션을 켜면 피들러가 꺼지면 요청이 실패하는 것처럼 느껴집니다! ... – user963991

+0

그리고 연결을 시도 했습니까? 낮은 수준에서 TcpClient를 사용합니까? –

+0

어떻게하면됩니까 ?? – user963991

0

스크레이퍼가 감지되고 종료되어 피들러가 감지 속도가 느려져서 감지되지 않을 수 있습니까? http://google-scraper.squabbel.com/

+0

같은 호스트의 다른 페이지는 요청할 때 작동합니다 ..... 그리고 다른 것은 작동하지 않습니다 !! – user963991

+0

이상한 문제. – kenny