2013-07-01 27 views
22

Tôi đã dành một ngày nghiên cứu một thư viện mà có thể được sử dụng để thực hiện những điều sau:Android Web Nạo với một trình duyệt Headless

  • Lấy đầy đủ nội dung của một trang web như thế nào trong nền mà không render kết quả đến một lượt xem.
  • Thư viện phải hỗ trợ các trang kích hoạt yêu cầu ajax để tải một số dữ liệu kết quả bổ sung sau khi HTML ban đầu được tải chẳng hạn.
  • Từ html kết quả, tôi cần lấy các phần tử trong biểu mẫu chọn xpath hoặc css.
  • Trong tương lai tôi cũng có thể cần phải điều hướng đến một trang tiếp theo (bắn ra các sự kiện, trình nút/liên kết vv)

Dưới đây là những gì tôi đã cố gắng nhưng không thành công:

  • Jsoup: Công trình tuyệt vời nhưng không hỗ trợ javascript/ajax (vì vậy nó không tải đầy đủ trang)
  • Android được xây dựng trong HttpEntity: cùng một vấn đề với javascript/ajax là jsoup
  • HtmlUnit: Nhìn chính xác những gì tôi cần nhưng sau giờ không thể làm việc trên roid (Những người dùng khác không thành công bằng cách cố gắng tải các tệp jar 12MB +. Bản thân tôi đã tải mã nguồn đầy đủ và tham chiếu nó như một thư viện dự án chỉ để thấy rằng những thứ như Applet và java.awt (được sử dụng bởi HtmlUnit) không tồn tại trong Android).
  • Tê giác - Tôi thấy điều này rất khó hiểu và không biết cách làm cho nó hoạt động trong Android và ngay cả khi đó là những gì tôi đang tìm kiếm.
  • Trình điều khiển Selenium: Có vẻ như nó có thể hoạt động nhưng bạn không có cách đơn giản để triển khai nó theo cách không đầu để bạn không hiển thị html thực tế cho chế độ xem.

Tôi thực sự muốn HtmlUnit hoạt động vì nó có vẻ phù hợp nhất với giải pháp của tôi. Có cách nào hay ít nhất một thư viện khác mà tôi đã bỏ lỡ, phù hợp với nhu cầu của tôi không?

Tôi hiện đang sử dụng Android Studio 0.1.7 và có thể chuyển sang Ellipse nếu cần.

Cảm ơn trước!

+1

Có vẻ rằng không có gì có thể được sử dụng cho các kịch bản của tôi là. Tôi đã bắt đầu làm việc trên một cổng Android cho HTMLUnit và hy vọng sẽ có một cái gì đó làm việc sớm. Tôi sẽ đăng bài ở đây ngay sau khi tôi đã kiểm tra trong một chi nhánh HtmlUnit mà bất kỳ ai cũng có thể tải xuống. Hy vọng rằng tôi có thể nhận được các nhà phát triển HtmlUnit tham gia vì có vẻ như có rất nhiều sự quan tâm đối với một cổng Android. – Pierre

+0

FYI: [PhantomJS.org] (http://phantomjs.org) có thể hữu ích cho những người khác, về "trình duyệt không đầu" – MiStr

+0

Đã 4 năm và chúng tôi đã dừng ở đây! TÔI ĐANG ĐỂ XÁC NHẬN CÂU HỎI! – mehulmpt

Trả lời

19

Ok sau 2 tuần tôi thừa nhận thất bại và đang sử dụng giải pháp thay thế hoạt động tốt cho tôi vào lúc này.

Sự cố:
Quá khó để chuyển HTMLUnit sang Android (hoặc ít nhất với trình độ chuyên môn của tôi). Tôi chắc chắn nó là một dự án đáng giá (và không tốn thời gian cho lập trình viên java có kinh nghiệm). Tôi gửi email cho những người ở HTMLUnit và họ nhận xét rằng họ không nhìn vào cổng hoặc nỗ lực sẽ tham gia nhưng đề nghị bất kỳ ai muốn bắt đầu với dự án như vậy sẽ gửi một tin nhắn đến danh sách gửi thư của họ để có thêm nhà phát triển tham gia (http://htmlunit.sourceforge.net/mail-lists.html) .

Cách giải quyết:
Tôi đã sử dụng WebView được tích hợp sẵn của Android và ghi đè phương thức onPageFinished của lớp Webview để tiêm Javascript lấy tất cả html sau khi trang đã được tải đầy đủ. Webview cũng có thể được sử dụng để gọi các hành động javascript khác, nhấp vào nút, điền vào biểu mẫu, v.v.

Code:

webView.getSettings().setJavaScriptEnabled(true); 
MyJavaScriptInterface jInterface = new MyJavaScriptInterface(context); 
webView.addJavascriptInterface(jInterface, "HtmlViewer"); 

webView.setWebViewClient(new WebViewClient() { 

@Override 
public void onPageFinished(WebView view, String url) { 

    //Load HTML 
    webView.loadUrl("javascript:window.HtmlViewer.showHTML 
     ('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');"); 
} 

webView.loadUrl(StartURL); 
ParseHtml(jInterface.html); 

public class MyJavaScriptInterface { 

    private Context ctx; 
    public String html; 

    MyJavaScriptInterface(Context ctx) { 
     this.ctx = ctx; 
    } 

    @JavascriptInterface 
    public void showHTML(String _html) { 
     html = _html; 
    } 
} 
+0

Tôi cũng đang cố gắng tạo ứng dụng android nhưng tôi cần phải cạo trang web đầu tiên để tiếp tục và trang web đó cũng được kích hoạt javascript (được nạp động), bất kỳ đề xuất nào? Cảm ơn! – ZdaR

+2

vấn đề này vẫn chưa được giải quyết, cổng htmlunit cho android sẽ là một giấc mơ khi bạn có thể nhận các phần tử từ trang và chạy phương thức .click() để tạo trang mới, có cách nào bạn có thể làm điều đó bằng cách sử dụng Android WebView ? –