2012-02-21 29 views
7

Có lẽ một câu hỏi newbie về nodejs/jsdomNodejs cạo trang web sau khi javascript đã nạp các giá trị

Tôi cố gắng để cạo một trang web sử dụng node.js. Tôi đang sử dụng jsdom và jquery để có được html và phân tích cú pháp những thứ cần thiết. Nhưng, bằng cách nào đó các giá trị tôi đang nhận được không phải là những người được hiển thị trên trang web. Về cơ bản các giá trị được thay đổi động bởi javascript và tôi muốn các giá trị đó. Lý do toàn bộ tôi đã sử dụng nodejs/jsdom cho cạo là js sẽ được thực hiện và tôi nhận được các giá trị sau sự kiện đó.

Có cách nào để yêu cầu jsdom đợi cho đến khi javascript thực thi không? hoặc tôi đã nhận tất cả điều này sai? Tôi đã googled rất nhiều về vấn đề này.

Trả lời

7

Bạn sẽ tốt hơn của việc sử dụng một cái gì đó giống như casperjs http://casperjs.org/. Nó là một tiện ích thử nghiệm dựa trên các phantomj. Về cơ bản nó giống như mở trang trong trình duyệt webkit, chỉ cần không có GUI. Bạn có thể viết một cái gì đó như thế nào. Tôi không nghĩ rằng nó hoạt động với nút, nhưng nó phải được dễ dàng, đủ để chạy một kịch bản casper và ống đầu ra trở lại nút:

var casper = require('casper').create({ 
    loadImages: true, 
    loadPlugins: true, 
    verbose: true, 
    //logLevel: 'info', 
    clientScripts: [ 
     'jquery-1.7.1.min.js', 
    ], 
    viewportSize: { 
     width: 1366, 
     height: 768, 
    }, 
    pageSettings: { 
     javascriptEnabled: true, 
     userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5', 
    }, 
}); 

casper.start(url); 

casper.thenEvaluate(function() { 
    //javascript code to run in the scope of the page 
}); 
0

Tôi không biết nếu bạn đang lên cho lựa chọn thay thế, nhưng khi tôi cần cào nhạy cảm như vậy, tôi chỉ cần sử dụng Firefox với iMacros. Nó chạy tất cả các trình duyệt JS tốt, bởi vì nó một trình duyệt.

http://www.iopus.com/imacros/firefox/

0

Trước hết, bạn sử dụng jsdom như thế nào? Rõ ràng, jsdom.env không thực thi tập lệnh trong DOM, chỉ các tập lệnh mà bạn thêm vào cuộc gọi đến jsdom.env. Nếu bạn muốn thực thi các script, tôi nghĩ bạn nên sử dụng jsdom.jsdom.

Thứ hai, bạn cần chỉ định trình xử lý onload. Điều này sẽ thực thi sau khi tài liệu đã sẵn sàng và hy vọng mọi tập lệnh sẽ thay đổi DOM theo ý thích của bạn.

Something như thế này:

var jsdom = require('jsdom').jsdom 
    , document = jsdom(html) 
    , window = document.createWindow(); 

document.onload = function() { 
    // Do your stuff 
} 
Các vấn đề liên quan