2010-01-25 2 views
2

HtmlUnit 헤드리스 브라우저를 사용하여이 webpage을 탐색합니다 (이 웹 페이지에서 문제를 더 잘 이해할 수 있음).HtmlUnit API for Java (헤드리스 브라우저)에 문제가 있습니까?

나는 다음과 같은 명령

final WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_7); 
    try { 
     // Configuring the webClient 
     webClient.setJavaScriptEnabled(true); 
     webClient.setThrowExceptionOnScriptError(false); 
     webClient.setCssEnabled(true); 
     webClient.setUseInsecureSSL(true); 
     webClient.setRedirectEnabled(true); 
     webClient.setActiveXNative(true); 
     webClient.setAppletEnabled(true); 
     webClient.setPrintContentOnFailingStatusCode(true); 
     webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 

     // Adding listeners 
     webClient.addWebWindowListener(new com.gargoylesoftware.htmlunit.WebWindowListener() { 

      public void webWindowOpened(WebWindowEvent event) { 
       numberOfWebWindowOpened++; 
       System.out.println("Number of opened WebWindow: " + numberOfWebWindowOpened); 
      } 

      public void webWindowContentChanged(WebWindowEvent event) { 
      } 

      public void webWindowClosed(WebWindowEvent event) { 
       numberOfWebWindowClosed++; 
       System.out.println("Number of closed WebWindow: " + numberOfWebWindowClosed); 
      } 
     }); 

     webClient.setWebConnection(new HttpWebConnection(webClient) { 
      public WebResponse getResponse(WebRequestSettings settings) throws IOException { 
       System.out.println(settings.getUrl()); 
       return super.getResponse(settings); 
      } 
     }); 

     CookieManager cm = new CookieManager(); 
     webClient.setCookieManager(cm); 


     HtmlPage page = webClient.getPage("http://www.ticketmaster.com/event/0B004354D90759FD?artistid=1073053&majorcatid=10002&minorcatid=207"); 

     HtmlSelect select = (HtmlSelect) page.getElementById("quantity_select"); 
select.setSelectedAttribute("1", true); 

로의 선택 값을 "1"

http://i45.tinypic.com/14m70up.jpg

을 설정 한 후 다음 버튼을

http://i50.tinypic.com/a27uv5.jpg

에 클릭 한 팔로 잉에 의해 g는

HtmlButtonInput button = (HtmlButtonInput) page.getElementById("find_tickets_button"); 
HtmlPage captchaPage = button.click(); 
Thread.sleep(60*1000); 
System.out.println("======captcha page======="); 
System.out.println(captchaPage.asXml()); 

하지만 심지어 버튼을 클릭하고 Thread.sleep를() 메소드를 통해 60 초 동안 기다린 후, 나는 같은 HtmlPage을 얻고있다

명령.

하지만 실제 브라우저에서 동일한 작업을 수행 할 때 보안 문자가 포함 된 페이지가 표시됩니다.

나는 htmlunit에서 뭔가를 놓치고 있다고 생각합니다.

Q1. htmlunit의 브라우저를 통해 동일한 페이지 (CAPTCHA 포함)가 표시되지 않는 이유는 무엇입니까?

+0

'webClient'를 작성하는 코드에 – Bozho

+1

으로'BROWSER_VERSION'을 설정하면 User-Agent 헤더를 설정해야합니다. 따라서 요청에 따라 브라우저가 보낸 HTTP 헤더와 응용 프로그램에서 (프록시를 통해) 보낸 메시지를 비교하여 차이점을 확인하십시오. – Bozho

+0

나는 그것을 또한 시도했다. 두 요청 모두 모든 요청 헤더가 동일합니다. –

답변

3

해당 페이지의 웹 양식에는 quantity_select 드롭 다운이 채워져 있어야합니다. 드롭 다운이 선택 요소라고 가정하여 코드에서이를 수행하려고합니다. 그러나 더 이상 선택 요소가 아닙니다. Firebug를 사용하여 드롭 다운을 검사하면 자바 스크립트가 select를 복잡한 중첩 div 요소 집합으로 대체 한 것을 확인할 수 있습니다.

각 사용자를 에뮬레이션하는 방법을 알아 내면 특이한 드롭 다운의 div를 클릭하여 양식을 제출할 수 있습니다.

+0

또는 방화범을 사용하여 사이트에서 양식에 필요한 것이 무엇인지 파악하고 요청에 따라 에뮬레이트 할 수도 있습니다. 때때로 그 단계를 건너 뛰기 쉬울 수도 있습니다 :-) – jpswain