2013-03-09 2 views
0

웹 페이지의 HTML을 다운로드하는 데 C#을 사용하고 있지만 웹 페이지의 실제 코드와 다운로드 한 코드를 확인할 때 완전히 다릅니다. 여기에 코드입니다 :사이트의 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

귀하가 보내는 상담원 헤더는 무엇입니까? 아마도 그들은 당신에게 모바일 버전을 보내고 있습니다. –

+0

다른 의미는 무엇입니까? 이상한 상징이 있습니까? 또는 브라우저의 HTML 소스 및 다운로드 한 문자열? –

답변

0

대부분의 경우 차이의 원인은 당신은 당신이 WebRequest 클래스를 사용하여 동일한 페이지를 요청할 때 설정되지 않은 세션의 일부 같은 페이지를 요청하는 브라우저를 사용하는 경우.

URL을 보면 쿼리 매개 변수 sid이 세션 식별자 또는 일종의 nonce 인 것처럼 보입니다. 이 페이지는 실제로 세션 ID와 비교하여 세션 ID가 다르다고 판단 할 때 "Ooopss .. wrong seesion"일종의 응답을 제공합니다.

당신이 다음 중 하나 이상을 포함해야 적절한 요청 생성 있는지 확인해야합니다 브라우저의 요청을 모방하기 위해 :

  • 쿠키 (이전에 웹 서버로 전송을)
  • 일부 특정 쿼리 매개 변수 (다시 페이지가 기대하는 내용에 따라)
  • 유효한/적절한 사용자 에이전트 잠재적
  • 리퍼러 URL
  • 인증 credenti 루게릭 병

당신이 필요로하는 무엇을 결정하는 가장 좋은 방법은 당신의 브라우저를 완료하고 페이지가 요청을 정확하게보고 처음부터 해당 페이지를 제공하는 웹 서버 사이에 대화을 따르는 것입니다, 어떤 순서로 어떤 정보는 앞뒤로왔다 갔다했다. WireShark 또는 Fidler를 사용하여이 작업을 수행 할 수 있습니다.

0

HttpWebRequest을 사용하여 페이지를 크롤링 할 때 동일한 문제가 발생하여 페이지에 ajax을 사용하여 모든 데이터를로드했습니다. ajax 호출이 발생하려면 WebBrowser 컨트롤로 전환했습니다.

This answer은 WinForms 앱 외부에서 컨트롤을 사용하는 방법에 대한 예제를 제공합니다. 페이지를 파싱하기 전에 브라우저의 DocumentCompleted 이벤트에 연결해야합니다. 페이지가 파싱 될 준비가되기 전에이 이벤트가 여러 번 발생할 수 있습니다. 페이지가 완전히로드 된 시점을 알기 위해 이벤트 핸들러에

if(browser.ReadyState == WebBrowserReadyState.Complete) 

을 추가 할 수 있습니다.

관련 문제