我如何使用node.jsdynamic内容页面?

我试图刮一个网站,但我没有得到一些元素,因为这些元素是dynamic创build的。

我在node.js中使用cheerio,我的代码如下所示。

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')); }); }); 

这段代码返回空的响应,因为当页面被加载时, <ul id="store_list" class="listMain">是空的。

内容尚未附上。

如何使用node.js获取这些元素? 我如何刮dynamic内容的网页?

干得好;

 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() }); }); }); }); }); 

使用新的npm模块X射线 ,带有可插拔的Web驱动程序X射线影像 。

在上面的页面的例子,但是这里是如何做dynamic抓取:

 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(); }) 

看看GoogleChrome / puppeteer

无头Chrome浏览器节点API

它使得拼凑相当微不足道。 下面的例子会在npmjs.com上标题(假设.npm-expansions依然存在)

 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将允许检查dynamic元素,因为这将在页面上运行脚本。