2012-04-01 41 views
58

Tôi đang tìm một ví dụ về yêu cầu trang web, chờ JavaScript hiển thị (JavaScript sửa đổi DOM), sau đó lấy HTML của trang.Lưu và hiển thị trang web bằng PhantomJS và node.js

Đây phải là ví dụ đơn giản với trường hợp sử dụng rõ ràng cho PhantomJS. Tôi không thể tìm thấy một ví dụ tốt, tài liệu có vẻ là tất cả về việc sử dụng dòng lệnh.

+0

Bạn đang tìm cách thực hiện phía máy khách này hoặc phía máy chủ? –

+4

@DeclanCook serverside Tôi nghĩ vậy? Clientside sẽ yêu cầu người dùng cài đặt phantom phải không? Mà sẽ không hoạt động nếu tôi hiểu chính xác. Cảm ơn – Harry

+1

Bạn đang cố gắng làm gì với html khi bạn có nó? Cố gắng để có được đầu của tôi xung quanh những gì bạn đang cố gắng để đạt được. Phantomjs có thao tác dom nhìn thấy http://code.google.com/p/phantomjs/wiki/QuickStart#DOM_Manipulation là bạn sau đó sẽ gửi điều này ở đâu đó? –

Trả lời

42

Từ ý kiến ​​của bạn, tôi đoán bạn có 2 lựa chọn

  1. Cố gắng tìm một module nút phantomjs - https://github.com/sgentle/phantomjs-node
  2. Run phantomjs như một quá trình đứa bé bị kẹt nút - http://nodejs.org/api/child_process.html

Chỉnh sửa:

Dường như quá trình con được đề xuất bởi phantomjs như một cách tương tác với nút, xem faq - http://code.google.com/p/phantomjs/wiki/FAQ

Edit:

Ví dụ Phantomjs kịch bản để nhận được các trang HTML markup:

var page = require('webpage').create(); 
page.open('http://www.google.com', function (status) { 
    if (status !== 'success') { 
     console.log('Unable to access network'); 
    } else { 
     var p = page.evaluate(function() { 
      return document.getElementsByTagName('html')[0].innerHTML 
     }); 
     console.log(p); 
    } 
    phantom.exit(); 
}); 
+0

Bạn có thể trình bày một ví dụ không? Lấy một trang, chạy javascript, nhận html? – Harry

+9

Bạn chỉ có thể sử dụng 'page.content', không cần đánh giá gì cả. – JLarky

+3

Điều này là tuyệt vời, nhưng ... đấu tranh để sử dụng yêu cầu ('trang web') trong kịch bản đó được bọc bằng nút vì mô-đun trang web không được xác định trong nút, nó ở dạng ma. Có ai có ý tưởng nào không? Là 'trang web' một mô-đun chung cho cả nút và phantom? Hoặc tôi có thể sử dụng yêu cầu trong bối cảnh phantom chỉ bằng cách nào đó? –

4

Tôi đã sử dụng hai cách khác nhau trong quá khứ, trong đó có phương pháp page.evaluate() mà truy vấn DOM mà Declan đã đề cập. Một cách khác tôi đã chuyển thông tin từ trang web là để nhổ nó ra để console.log() từ đó, và trong việc sử dụng phantomjs kịch bản:

page.onConsoleMessage = function (msg, line, source) { 
    console.log('console [' +source +':' +line +']> ' +msg); 
} 

tôi có thể cũng bẫy msg biến trong onConsoleMessage và tìm kiếm một số dữ liệu đóng gói. Phụ thuộc vào cách bạn muốn sử dụng đầu ra.

Sau đó, trong kịch bản Nodejs, bạn sẽ phải quét đầu ra của kịch bản Phantomjs:

var yourfunc = function(...params...) { 
    var phantom = spawn('phantomjs', [...args]); 
    phantom.stdout.setEncoding('utf8'); 
    phantom.stdout.on('data', function(data) { 
    //parse or echo data 
    var str_phantom_output = data.toString(); 
    // The above will get triggered one or more times, so you'll need to 
    // add code to parse for whatever info you're expecting from the browser 
    }); 
    phantom.stderr.on('data', function(data) { 
    // do something with error data 
    }); 
    phantom.on('exit', function(code) { 
    if (code !== 0) { 
     // console.log('phantomjs exited with code ' +code); 
    } else { 
     // clean exit: do something else such as a passed-in callback 
    } 
    }); 
} 

Hy vọng rằng sẽ giúp một số.

1

Cuối cập nhật trong trường hợp bất cứ ai tình cờ về câu hỏi này:

Một dự án trên GitHub phát triển bởi một đồng nghiệp của tôi chính xác nhằm giúp bạn làm điều đó: https://github.com/vmeurisse/phantomCrawl.

Vẫn còn hơi trẻ, chắc chắn thiếu một số tài liệu, nhưng ví dụ được cung cấp sẽ giúp thực hiện thu thập thông tin cơ bản.

3

Tại sao không chỉ sử dụng tính năng này?

1

Đây là phiên bản cũ mà tôi sử dụng nút chạy, ký tự đại diện và phantomj để lưu trang dưới dạng .png. Bạn có thể tinh chỉnh nó khá nhanh chóng để có được html.

https://github.com/wehrhaus/sitescrape.git

+0

FYI, nếu bạn định sử dụng liên kết để cung cấp câu trả lời, tốt nhất nên bao gồm đủ thông tin mà câu trả lời của bạn sẽ không trở thành vô dụng nếu liên kết xảy ra để phá vỡ vào một thời điểm nào đó trong tương lai. –

+0

để lưu như png bạn chỉ cần làm page.render ('file.png') – Toolkit

7

Với v2 của phantomjs-node nó khá dễ dàng để in HTML sau khi nó đã được xử lý.

var phantom = require('phantom'); 

phantom.create().then(function(ph) { 
    ph.createPage().then(function(page) { 
    page.open('https://stackoverflow.com/').then(function(status) { 
     console.log(status); 
     page.property('content').then(function(content) { 
     console.log(content); 
     page.close(); 
     ph.exit(); 
     }); 
    }); 
    }); 
}); 

Điều này sẽ hiển thị kết quả như được hiển thị với trình duyệt.

+0

nó có cho phép hiển thị HTML cho một chuỗi không? –

+0

Có nó .... –

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