2014-05-05 6 views
5

Sto cercando di raccogliere informazioni da un insieme di pagine Web che sono tutte formattate in modo molto simile. Ho bisogno di alcune informazioni che vengono caricate nella pagina da Javascript dopo l'apertura. Sembra che HTMLUnit sia uno strumento abbastanza comune per farlo, quindi è quello che sto usando. È sfortunatamente molto lento, che è una lamentela che ho visto in molti forum. Il comando webClient.getPage() è ciò che sta richiedendo per sempre. Quando spengo Javascript, viene eseguito rapidamente, ma ho bisogno di eseguire alcuni comandi Javascript. Mi stavo chiedendo, c'è un modo per eseguire selettivamente alcuni comandi Javascript invece di tutti?Posso configurare HTMLUnit per eseguire solo processi javascript specifici e non il tutto?

In alternativa, esiste un programma molto più veloce di HTMLUnit per l'elaborazione di Javascript?

risposta

3

Sort of. Puoi decidere in modo programmatico quali URL JavaScript esterni caricare:

HtmlUnit eseguirà tutto JS incorporato nella pagina, se JavaScript è abilitato. Tuttavia, se alcuni URL esterni non sono richiesti, puoi scegliere di non caricarli.

Ecco il codice per ottenere il vostro iniziato:

webClient.setWebConnection(new FalsifyingWebConnection(webClient) { 
     @Override 
     public WebResponse getResponse(WebRequest request) throws IOException { 

      if(request.getUrl().getPath().toLowerCase().equals("some url i don't need ")) { 
       return createWebResponse(request, "", "application/javascript"); 
      } 

      return super.getResponse(request); 
     } 
    }); 

Impostazione sottostante potrebbe accelerare le cose troppo:

java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF); 

    webClient.setCssErrorHandler(new SilentCssErrorHandler()); 

    webClient.setIncorrectnessListener(new IncorrectnessListener() { 
     @Override 
     public void notify(String s, Object o) { } 
    }); 

    webClient.getCookieManager().setCookiesEnabled(false); 
    webClient.getOptions().setCssEnabled(false); 
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 
    webClient.getOptions().setThrowExceptionOnScriptError(false); 
    webClient.getOptions().setPrintContentOnFailingStatusCode(false); 
+0

Grazie, ho appena provato la seconda parte, e lo ha fatto aiutare un po '. Proverò la prima parte domani e vedrò come va. Qualche idea su altri strumenti da usare? Sono a conoscenza del fatto che questo è un kit di test e quindi funziona lentamente per poter gestire bene il codice malformato. Dal momento che lo sto usando su siti web che funzionano chiaramente, c'è uno strumento più veloce che conosci? –

+0

@ user3598519 puoi provare anche phantomJS. è piuttosto veloce. HtmlUnit è un po 'più robusto però. –

+0

Che ne dici di usare NodeJS? Ho appena iniziato a leggerlo, sembra che sia veloce ma forse ha delle limitazioni di funzionalità che non conosco. Per il compito di caricare una pagina Web, eseguire un comando javascript dalla pagina e raccogliere i risultati, NodeJS sarebbe un'alternativa più veloce? –

Problemi correlati