2015-02-26 14 views
12

Tôi đang cố gắng để cạo một website nhưng tôi không nhận được một số yếu tố, bởi vì các yếu tố này được tạo động.Làm cách nào để tôi có thể xóa các trang có nội dung động bằng cách sử dụng node.js?

Tôi sử dụng cổ vũ trong node.js và Mã của tôi ở bên dưới.

var request = require('request'); 
var cheerio = require('cheerio'); 
var url = "http://www.bdtong.co.kr/index.php?c_category=C02"; 

request(url, function (err, res, html) { 
    var $ = cheerio.load(html); 
    $('.listMain > li').each(function() { 
     console.log($(this).find('a').attr('href')); 
    }); 
}); 

Mã này trả về phản hồi trống, vì khi trang được tải, <ul id="store_list" class="listMain"> bị trống.

Nội dung chưa được thêm vào.

Làm cách nào để có được các phần tử này bằng cách sử dụng node.js? Làm thế nào tôi có thể cạo trang bằng nội dung động?

+0

sử dụng phantom.js một trình duyệt không có đầu, trình duyệt sẽ tải và hiển thị trang. bạn có thể truy cập các yếu tố khác nhau trên trang bằng cách sử dụng API javascript của nó. – Safi

+0

Cảm ơn Safi! Nhưng bạn có thể cho tôi một đoạn mã hoặc một số tham chiếu với trường hợp này không? – JayD

Trả lời

15

Ở đây bạn đi;

var phantom = require('phantom'); 

phantom.create(function (ph) { 
    ph.createPage(function (page) { 
    var url = "http://www.bdtong.co.kr/index.php?c_category=C02"; 
    page.open(url, function() { 
     page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() { 
     page.evaluate(function() { 
      $('.listMain > li').each(function() { 
      console.log($(this).find('a').attr('href')); 
      }); 
     }, function(){ 
      ph.exit() 
     }); 
     }); 
    }); 
    }); 
}); 
+0

Cập nhật mã để làm cho nó hoạt động với node.js – Safi

+0

Cảm ơn! Tôi sẽ cố gắng chạy mã này và tôi sẽ thêm phản hồi cho người dùng khác !!. :) – JayD

+0

Điều này hoạt động tốt !! Cảm ơn nhiều. Nhưng tôi có một câu hỏi khác. Trang này nối thêm con bằng cách cuộn xuống. Vì vậy, tôi phải biết khi nào kết thúc của nhóm đó được đính kèm. Có thể trên mã khai báo gọi lại (function() {ph.exit()} nhưng ma không bị chấm dứt và giữ lại con trỏ !! – JayD

11

Sử dụng các module NPM mới x-ray, với một trình điều khiển web pluggable x-ray-phantom.

Ví dụ trong các trang trên, nhưng đây là cách thực hiện nạo động:

var phantom = require('x-ray-phantom'); 
var Xray = require('x-ray'); 

var x = Xray() 
    .driver(phantom()); 

x('http://google.com', 'title')(function(err, str) { 
    if (err) return done(err); 
    assert.equal('Google', str); 
    done(); 
}) 
+0

Bạn đang chạy chương trình này là 'nút google_xray_code.js 'hoặc như' phantomjs google_xray_code.js' ?? Ở dạng hiện tại, các phantomj không phải là một mô-đun nút. – zipzit

+0

@zipzit phantom không phải là một mô-đun nút, nó là trình điều khiển bạn cài đặt bên ngoài và xuất đường dẫn nếu bạn muốn sử dụng nó với x-quang – Keng

+0

điều gì làm cho động này? tiêu đề trang của google.com là tĩnh không? – 1mike12

3

Check-out GoogleChrome/puppeteer

Headless Chrome Node API

Nó làm cho cào khá tầm thường. Ví dụ sau sẽ cạo tiêu đề qua tại npmjs.com (giả sử .npm-expansions cốt)

const puppeteer = require('puppeteer'); 

(async() => { 
    const browser = await puppeteer.launch(); 
    const page = await browser.newPage(); 

    await page.goto('https://www.npmjs.com/'); 

    const textContent = await page.evaluate(() => { 
    return document.querySelector('.npm-expansions').textContent 
    }); 

    console.log(textContent); /* No Problem Mate */ 

    browser.close(); 
})(); 

evaluate sẽ cho phép kiểm tra các yếu tố năng động như thế này sẽ chạy script trên trang.

+0

Lựa chọn tốt, kế toán, [thông báo] này (https://groups.google.com/forum/m/# ! topic/phantomjs/9a I5d-LDuNE) – slesh

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