2013-03-16 2 views
2

Я пытаюсь использовать HTMLUnit для создания crawlable HTML-снимков наших страниц ajax (как предложено https://developers.google.com/webmasters/ajax-crawling/). Идея заключается в создании функциональных возможностей, позволяющих бизнесу создавать моментальные снимки либо через регулярный запланированный сервис, либо по собственному желанию.Запуск HtmlUnit через Tomcat 7

Я написал быстрый основной класс POC, чтобы проверить теорию, и она работала должным образом (при просмотре источника мы можем видеть все данные, необходимые для искателя Google, которые мы не могли видеть раньше). Я теперь интегрировать это в наше приложение, которое работает на сервере Tomcat 7 и у меня есть проблема, загрузив jquery.js от Google со следующими логами

2013-03-15 18:10:38,071 ERROR [author->taskExecutor-1] com.gargoylesoftware.htmlunit.html.HtmlPage  : Error loading JavaScript from [https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js]. 
javax.net.ssl.SSLException: hostname in certificate didn't match: <ajax.googleapis.com/173.194.67.95> != <*.googleapis.com> OR <*.googleapis.com> OR <googleapis.com> 
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:228) 
at org.apache.http.conn.ssl.BrowserCompatHostnameVerifier.verify(BrowserCompatHostnameVerifier.java:54) 
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:149) 
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:130) 
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:397) 
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:495) 
at org.apache.http.conn.scheme.SchemeSocketFactoryAdaptor.connectSocket(SchemeSocketFactoryAdaptor.java:62) 
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148) 
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:150) 

... 

Из-за этот Ajax не выполняются и моментальные снимки не содержит данных в источнике просмотра, которого мы желаем. Кто-нибудь знает, почему это произойдет в моей версии Tomcat кода, а не в моем автономном основном классе? Обе версии работают на моей локальной машине, одна - в Tomcat (v7) и одна - как Java-приложение. Обе версии имеют один и тот же Maven (см. Снизу).

Примечание: Я попытался указать BrowserVersion, когда instatiating WebClient client = new WebClient(BrowserVersion.FIREFOX_17);, поскольку я прочитал это, это даст лучшие результаты (извините, я не могу вспомнить ссылку). Опять же, это отлично работает в POC, но когда я запускаю это в Tomcat, я вижу журнал «Instatiating Web Client», но независимо от того, как долго я жду, он никогда не попадает в «Client Instatiated» или не бросает никаких исключений. Я не знаю, связано ли это с тем, что вы не можете загрузить jqeury.js, хотя он все еще работает в POC без указанной BrowserVersion.

Вот мой основной метод POC Java, который работает

 OutputStreamWriter writer = null; 

     try { 
      final WebClient webClient = new WebClient(); 
      webClient.getOptions().setThrowExceptionOnScriptError(false); 
      webClient.getOptions().setPrintContentOnFailingStatusCode(false); 
      final HtmlPage page = (HtmlPage)webClient.getPage("http://myurl.com"); 

      webClient.waitForBackgroundJavaScript(1500); 

      File file = new File("C:\\test.html"); 
      FileUtils.touch(file); 

      writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); 
      writer.write(page.asXml()); 
      writer.flush(); 

     } catch (MalformedURLException mue) { 
      System.out.println("MalformedURL exception"); 
     } catch (IOException ioe) { 
      System.out.println("IOException occurred " + ioe.getMessage()); 
     } finally { 
      IOUtils.closeQuietly(writer); 
     } 

Вот мой интегрированной версии

 /* Entry point for the generation */ 
    public void generate() { 

     log.info("Beginning snapshot generation..."); 

     try { 

      // Get the URLS 
      log.info("Retrieving list of page urls"); 
      List<String> pageUrls = getUrlList(); 
      log.info("Found {} urls to generate", pageUrls.size()); 

      // For every url we have generate a snapshot 
      for (String pageUrl: pageUrls) { 
       takeSnapshot(pageUrl); 
      } 
      log.info("Finished generating snapshots!"); 
     } catch (Exception e) { 
      log.error("Exception caught while generating snapshot", e); 
     } 
    } 

    /** 
    * Take the HTML snapshot of the url and output to the snapshot directory 
    */ 
    private void takeSnapshot(String pagePath) { 
     try { 
      String fullOutputFilePath = config.getHtmlSnapshotDirectory() + File.separator 
                 + pagePath + File.separator + HTML_SNAPSHOT_FILE_NAME; 
      String pageUrl = "http://myurl.com" + pagePath; 

      log.debug("Instantiating Web Client..."); 
      final WebClient webClient = new WebClient(); 
      log.debug("Client instantiated"); 
      webClient.getOptions().setThrowExceptionOnScriptError(false); 
      webClient.getOptions().setPrintContentOnFailingStatusCode(false); 
      final HtmlPage page = (HtmlPage)webClient.getPage(pageUrl); 

      webClient.waitForBackgroundJavaScript(1500); 

      snapshotFile = new File(fullOutputFilePath); 
      FileUtils.touch(snapshotFile); 

      writer = new OutputStreamWriter(new FileOutputStream(snapshotFile), "UTF-8"); 
      writer.write(page.asXml()); 
      writer.flush(); 
     } catch (MalformedURLException mue) { 
      System.out.println("MalformedURL exception"); 
     } catch (IOException ioe) { 
      System.out.println("IOException occurred " + ioe.getMessage()); 
     } finally { 
      IOUtils.closeQuietly(writer); 
     } 
    } 

зависимостями Maven

 <dependency> 
      <groupId>net.sourceforge.htmlunit</groupId> 
      <artifactId>htmlunit</artifactId> 
      <version>2.12</version> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
      <version>4.2.3</version> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpcore</artifactId> 
      <version>4.3-alpha1</version> 
     </dependency> 

Спасибо всем !!!

+0

Я обнаружил, что могу использовать 'webClient.getOptions(). SetUseInsecureSSL (true);' в попытке обойти проблему SSL. Однако, когда я включаю эту строку над другим '.getOptions(). Set ...' statemtents, тогда код просто зависает в этой строке (как это было при указании версии браузера). Это значит, что я все еще застрял. Любая помощь очень ценится. – DecafCoder

ответ

1

Таким образом, добавив webClient.getOptions().setUseInsecureSSL(true);, был использован для исправления этой ситуации. Однако мне пришлось использовать устаревшую версию webClient.setUseInsecureSSL(true);.

Я не знаю, почему более новая версия не работает при запуске в Tomcat, но она исправила проблему. Если кто-нибудь может понять, почему это было бы здорово. Я также по-прежнему не понимаю, почему настройка BrowserVersion при запуске Tomcat заставляет приложение останавливаться. Я попросил список рассылки HtmlUnit для ответов на эти вопросы.

Смежные вопросы