NodeJS模拟浏览器的get / post请求

时间:2017-05-21 17:09:22

标签: javascript node.js browser

当我搜索模拟浏览器时,有很多混合的结果。长话短说,我需要我的节点服务器才能获得&发布请求。通常我只是用http包来做这件事。但是,另一方面有一些反脚本的东西。即javascripts,让服务器知道它是一个真正的浏览器。所以,我需要执行这些。

我实际上像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 个答案:

答案 0 :(得分:2)

  

由于NodeJS是基于V8构建的,我认为有一种简单的方法可以做到这一点。

实际上,不!在浏览器的上下文中运行除了能够执行JavaScript之外还有很多。所有的DOM东西以及Node.js中没有的东西。 Node.js只有JavaScript引擎。

如果没有浏览器引擎,您将不知道要加载哪些脚本,以什么顺序加载,或者能够提供documentwindow附带的所有内容,这可能是必需的部分你想要做什么。

  

解决方案涉及使用Qt webkit小部件和假X服务器。不优雅,但很容易做到。

这实际上是正确的解决方案......主要是。幸运的是,现在有一些工具可以很好地优化它。

看看PhantomJS。 http://phantomjs.org/您可以像编写Node.js一样编写脚本。 (它支持require()什么不支持,以及大多数你想要工作的NPM包。)PhantomJS将允许你运行页面并轻松地拉出DOM内容。

如果在JavaScript环境中构建的PhantomJS不包含您需要的某些Node.js组件(例如,对于文件系统或网络访问),您始终可以从Node.js应用程序控制PhantomJS。 https://github.com/amir20/phantomjs-node