Nodejs在JavaScript加载值之后刮取网站

可能是nodejs / jsdom的一个新手问题

我正在尝试使用node.js刮一个网站。 我正在使用jsdom和jquery来获取HTML和parsing所需的东西。 但是,不知何故,我得到的价值不是网站上显示的价值。 基本上这些值是dynamic改变的JavaScript,我想这些值。 我使用nodejs / jsdom进行抓取的所有原因是,js将被执行,并在事件发生后获取值。

有没有什么方法可以告诉jsdom等待JavaScript执行? 还是我有这个全错了? 我在这个问题上search了很多。

你会更好地使用像casperjs http://casperjs.org/ 。 这是一个基于phantomjs的testing工具。 基本上就像在webkit浏览器中打开页面一样,只是没有GUI。 你可以写一些类似的东西。 我不认为它适用于节点,但它应该很容易运行一个casper脚本,并将输出返回到节点:

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

我不知道你是否有替代品,但当我需要这种敏感的刮,我只是使用Firefox与iMacros。 它运行所有的浏览器JS就好,因为它一个浏览器。

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

首先,你如何使用jsdom? 显然, jsdom.env不会在DOM中执行脚本,只会在调用jsdom.env添加的脚本。 如果你想执行脚本,我想你应该使用jsdom.jsdom

其次,你需要指定一个onload处理程序。 这应该在文档准备好之后执行,并且希望任何脚本都会根据您的喜好更改DOM。

像这样的东西:

 var jsdom = require('jsdom').jsdom , document = jsdom(html) , window = document.createWindow(); document.onload = function() { // Do your stuff }