2014-05-05 12 views
5

Szukam informacji z zestawu stron internetowych, które są bardzo podobnie sformatowane. Potrzebuję trochę informacji, które po otwarciu są ładowane na stronę przez Javascript. Wygląda na to, że HTMLUnit jest dość powszechnym narzędziem do robienia tego, więc właśnie tego używam. Jest niestety bardzo powolny, co jest skargą, którą widziałem na wielu forach. Komenda webClient.getPage() jest tym, co trwa wiecznie. Kiedy wyłączam JavaScript, działa szybko, ale muszę wykonać kilka poleceń JavaScript. Zastanawiam się, czy istnieje sposób selektywnego wykonywania kilku poleceń JavaScript zamiast ich wszystkich?Czy mogę skonfigurować HTMLUnit tak, aby uruchamiał tylko określone procesy javascript, a nie całość?

Czy istnieje program, który jest znacznie szybszy niż HTMLUnit do przetwarzania Javascript?

Odpowiedz

3

Sortuj. Możesz programowo zdecydować, które zewnętrzne URL-e JavaScript mają być ładowane:

HtmlUnit uruchomi wszystkie JS osadzone na stronie, jeśli włączona jest obsługa JavaScript. Jeśli jednak niektóre zewnętrzne adresy URL nie są wymagane, możesz je nie ładować.

Oto niektóre kodu, aby uzyskać swój początek:

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); 
     } 
    }); 

Ustawianie poniżej może przyspieszyć zbyt:

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

Dzięki, ja tylko starałem drugą część, i to miało pomóc trochę. Wypróbuję jutro pierwszą część i zobaczę jak to działa. Wszelkie przemyślenia na temat innych narzędzi do użycia? Rozumiem, że jest to zestaw testowy i dlatego działa wolno, aby dobrze sobie poradzić ze zniekształconym kodem. Ponieważ używam go na stronach, które wyraźnie działają, czy istnieje szybsze narzędzie, które znasz? –

+0

@ user3598519 możesz też spróbować phantomJS. jest dość szybki. HtmlUnit jest jednak nieco bardziej wytrzymały. –

+0

Co z używaniem NodeJS? Właśnie zacząłem o tym czytać, wygląda na to, że jest szybkie, ale może ma ograniczenia w funkcjonalności, o których nie wiem. Czy w przypadku ładowania strony internetowej, uruchamiania polecenia javascript ze strony i zbierania wyników NodeJS byłaby szybszą alternatywą? –