2012-02-28 23 views
49

phantomjs có cấu hình LoadImage,Làm thế nào tôi có thể kiểm soát PhantomJS để bỏ qua tải xuống một số loại tài nguyên?

nhưng tôi muốn nhiều hơn nữa,

làm thế nào tôi có thể kiểm soát phantomjs để bỏ qua tải về một số loại tài nguyên,

như css vv ...

== ===

tin vui: tính năng này được thêm vào.

https://code.google.com/p/phantomjs/issues/detail?id=230

Các ý chính:

page.onResourceRequested = function(requestData, request) { 
    if ((/http:\/\/.+?\.css/gi).test(requestData['url']) || requestData['Content-Type'] == 'text/css') { 
     console.log('The url of the request is matching. Aborting: ' + requestData['url']); 
     request.abort(); 
    } 
}; 
+0

Tôi cũng muốn biết điều này, làm thế nào để làm cho phantomjs bỏ qua một nguồn lực đặc biệt – iwek

+3

tin tốt: Tính năng này được thêm vào. – atian25

+3

@ user2864740 Tại sao phải chỉnh sửa câu hỏi đó và không đăng câu trả lời? –

Trả lời

7

Vì vậy, cuối cùng bạn có thể thử này http://github.com/eugenehp/node-crawler

nếu không bạn vẫn có thể thử phương pháp dưới đây với PhantomJS

Cách dễ dàng, là để trang tải -> trang phân tích cú pháp -> loại trừ tài nguyên không mong muốn -> tải nó vào PhatomJS.

Một cách khác chỉ đơn giản là chặn các máy chủ trong tường lửa.

Tùy chọn, bạn có thể sử dụng proxy để chặn một số địa chỉ URL và truy vấn nhất định.

Và phần bổ sung, tải trang, sau đó xóa các tài nguyên không mong muốn, nhưng tôi nghĩ đó không phải là cách tiếp cận phù hợp tại đây.

+0

Tôi tự hỏi tại sao PhatomJS lại không tự làm điều này? đôi khi, chúng tôi cần tải rất nhiều trang mà không cần css/img, không thể loại trừ tài nguyên không mong muốn bằng tay – atian25

+0

Có điều như page.content, bạn có thể thao tác với một số loại tài nguyên lọc bằng bộ lọc regex (css, js). Hoặc bạn chỉ có thể thu thập dữ liệu trang web và phân tích cú pháp chỉ những hình ảnh bạn muốn để lại. –

+0

cảm ơn bạn đã trả lời. Ý của bạn là có một số giao diện bộ lọc/api được cung cấp bởi Phantomjs mà chúng tôi có thể bỏ qua một số loại tài nguyên?(không tải xuống nữa). tên api là gì? – atian25

3

Không có cách nào cho bây giờ (phantomjs 1.7), nó KHÔNG hỗ trợ điều đó.

Nhưng một giải pháp khó chịu đang sử dụng proxy http, vì vậy bạn có thể lọc ra một số yêu cầu mà bạn không cần

+0

Tất nhiên đây là giải pháp tốt nhất, btw bạn nên luôn sử dụng proxy (véc ni hoặc mực) để "kiểm soát" chương trình của bạn đang tải xuống (để thêm hàng đợi, bộ nhớ đệm, v.v.) –

6

Sử dụng page.onResourceRequested, như trong ví dụ loadurlwithoutcss.js:

page.onResourceRequested = function(requestData, request) { 
    if ((/http:\/\/.+?\.css/gi).test(requestData['url']) || 
      requestData.headers['Content-Type'] == 'text/css') { 
     console.log('The url of the request is matching. Aborting: ' + requestData['url']); 
     request.abort(); 
    } 
}; 
14

CẬP NHẬT, công tác !

Vì PhantomJS 1.9, câu trả lời hiện tại không hoạt động. Bạn phải sử dụng mã này:

var webPage = require('webpage'); 
var page = webPage.create(); 

page.onResourceRequested = function(requestData, networkRequest) { 
    var match = requestData.url.match(/wordfamily.js/g); 
    if (match != null) { 
    console.log('Request (#' + requestData.id + '): ' + JSON.stringify(requestData)); 
    networkRequest.cancel(); // or .abort() 
    } 
}; 

Nếu bạn sử dụng hủy bỏ() thay vì hủy(), nó sẽ kích hoạt onResourceError.

Bạn có thể look at the PhantomJS docs

+0

phantomjs 2.1.1 không hủy() chỉ hủy bỏ() – waza123

+0

@ waza123 phải hoạt động – webo80

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