在JSDOM中加载URL时获取“拒绝访问”

我正在尝试使用jsdom.env函数来抓取页面的一些信息。 但是,在env()callback中返回的页面是关于如何拒绝服务器的访问,而不是我在浏览器中加载相同URL时希望看到的内容。

因此,浏览器如何加载页面与jsdom如何加载页面似乎有所不同。 这是可以在jsdom模块中configuration的jsdom吗?

编辑:

示例url: http://www.bestbuy.com/site/HP+-+20%22+Widescreen+Flat-Panel+LCD+Monitor/1422209.p?id=1218257754431&skuId=1422209 : http://www.bestbuy.com/site/HP+-+20%22+Widescreen+Flat-Panel+LCD+Monitor/1422209.p?id=1218257754431&skuId=1422209 1218257754431& http://www.bestbuy.com/site/HP+-+20%22+Widescreen+Flat-Panel+LCD+Monitor/1422209.p?id=1218257754431&skuId=1422209

更新:

问题是jsdom没有指定用户代理http头。 看下面的详细答案

问题在于jsdom没有指定bestbuy.com服务器正在检查的“User-Agent”http头。 如果它是空的,访问被拒绝。 目前,没有办法通过jsdom来指定 – https://github.com/tmpvar/jsdom/issues/196

一个解决方法,我使用request模块来获取页面内容,然后传递给jsdom来工作。 request模块允许您指定一个用户代理

例:

 var request = require('request'), getPage = function(someUri, callback) { request({uri: someUri, headers:{'User-Agent': 'Mozilla/5.0'}}, function (error, response, body) { console.log("Fetched " +someUri+ " OK!"); callback(body); }); } getPage('http://www.bestbuy.com/', function(body) { console.log(body) }); 

默认情况下,跨域AJAX调用是不可能的。 这里有更多的信息: http : //m.snook.ca/archives/javascript/cross_domain_aj