2014-05-05 27 views
5

Tôi đang tìm cách thu thập thông tin từ một tập hợp các trang web được định dạng rất giống nhau. Tôi cần một số thông tin được tải lên trang bằng Javascript sau khi mở. Có vẻ như HTMLUnit là một công cụ khá phổ biến để làm điều này, vì vậy đó là những gì tôi đang sử dụng. Thật không may là rất chậm, đó là một khiếu nại tôi đã nhìn thấy trên rất nhiều diễn đàn. Lệnh webClient.getPage() là những gì đang thực hiện mãi mãi. Khi tôi tắt Javascript, nó chạy nhanh, nhưng tôi cần thực hiện một số lệnh Javascript. Tôi đã tự hỏi, là có một cách để chọn lọc thực hiện một vài lệnh Javascript thay vì tất cả chúng?Tôi có thể cấu hình HTMLUnit để chỉ chạy các quy trình javascript cụ thể chứ không phải toàn bộ?

Ngoài ra, có chương trình nào nhanh hơn HTMLUnit để xử lý Javascript không?

Trả lời

3

Sắp xếp. Bạn có thể quyết định lập trình các URL JavaScript bên ngoài để tải:

HtmlUnit sẽ chạy tất cả JS được nhúng trên trang, nếu JavaScript được bật. Tuy nhiên, nếu không yêu cầu URL bên ngoài nhất định, bạn có thể chọn không tải chúng.

Dưới đây là một số mã để giúp bạn bắt đầu:

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

Thiết lập dưới đây có thể điều tốc độ lên quá:

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

Cảm ơn, tôi chỉ cố gắng phần thứ hai, và nó đã giúp một chút. Tôi sẽ thử phần đầu tiên vào ngày mai và xem nó như thế nào. Bất kỳ suy nghĩ về các công cụ khác để sử dụng? Đó là sự hiểu biết của tôi rằng đây là một bộ thử nghiệm và do đó hoạt động từ từ để đối phó tốt với mã không đúng định dạng. Vì tôi đang sử dụng nó trên các trang web hoạt động rõ ràng, bạn có biết công cụ nhanh hơn không? –

+0

@ user3598519 bạn cũng có thể thử phantomJS. nó khá nhanh. HtmlUnit là một chút mạnh mẽ hơn mặc dù. –

+0

Điều gì về việc sử dụng NodeJS? Tôi mới bắt đầu đọc về nó, có vẻ như nó nhanh nhưng có thể có những hạn chế về chức năng mà tôi không biết. Đối với nhiệm vụ tải trang web, chạy lệnh javascript từ trang và thu thập kết quả, liệu NodeJS có thay thế nhanh hơn không? –

Các vấn đề liên quan