NodeJS 模拟浏览器发起 GET/POST 请求

4
当我搜索浏览器仿真时,结果千差万别。长话短说,我需要我的Node服务器进行get和post请求。通常我会使用http包来实现这个目的。然而,在另一端有一些反脚本技术。主要是JavaScript,让服务器知道它是一个真正的浏览器。所以,我需要执行这些脚本。
实际上,我在5年前解决了这个问题,但那时我的网站只使用PHP。解决方案涉及使用Qt WebKit小部件和虚假的X服务器。虽然不太优雅,但很容易实现。当时我发现Perl、PHP或Python中唯一可用的JavaScript引擎都非常慢。
由于NodeJS基于V8构建,我认为一定有一种简单的方法可以做到这一点。记录一下,我希望能得到以下内容。
// Omitting some callbacks
http.get('http://remote.site', function(res) {
  res.on('end', function() {
      // previously accumulated data is the page returned by
      // the request.  Any thing found in a <script> tag would have
      // been executed.
  });   
});
1个回答

2
由于NodeJS是建立在V8之上的,我认为有一种简单的方法可以做到这一点。
事实并非如此!在浏览器环境中运行远不止能够执行JavaScript这么简单。所有DOM相关的东西都不存在于Node.js中。Node.js仅具备JavaScript引擎。
如果没有浏览器引擎,你将不知道要加载哪些脚本,以什么顺序加载,并且无法提供documentwindow所包含的所有内容,而这可能是你尝试做的必要部分。
解决方案涉及使用Qt WebKit小部件和一个虚假的X服务器。虽然不够优雅,但很容易实现。
实际上,这是正确的解决方案……大多数情况下。幸运的是,现在已经有了一些优化得相当不错的现成工具。
看一下PhantomJS。http://phantomjs.org/你可以像编写Node.js脚本一样为它编写脚本。(它支持require()等,大多数你需要的NPM包都能用。)PhantomJS将使你能够轻松地运行页面并提取DOM内容。
如果PhantomJS内置的JavaScript环境不包含你需要的某些Node.js组件(例如文件系统或网络访问),你总是可以从你的Node.js应用程序控制PhantomJS。https://github.com/amir20/phantomjs-node

感谢您的深入回复。我会尝试使用PhantomJS! - kiss-o-matic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接