当我搜索模拟浏览器时,有很多混合的结果.长话短说,我需要我的节点服务器才能获得&发布请求.通常我只是用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.
});
});
最佳答案
As NodeJS is built on V8, I gotta think there’s an easy way to do this.
实际上,不!在浏览器的上下文中运行除了能够执行JavaScript之外还有很多.所有的DOM东西以及Node.js中没有的东西. Node.js只有JavaScript引擎.
如果没有浏览器引擎,您将不知道要加载哪些脚本,以什么顺序加载,或者能够提供文档或窗口附带的所有内容,这可能是您尝试执行的操作的必要部分.
The solution involved using a Qt webkit widget, and a fake X-server. Not elegant, but it was pretty easy to do.
这实际上是正确的解决方案……主要是.幸运的是,现在有一些工具可以很好地优化这一点.
看看PhantomJS. http://phantomjs.org/您可以像编写Node.js一样编写脚本. (它支持require()和不需要的,以及大多数你想要工作的NPM包.)PhantomJS将允许你运行页面并轻松地拉出DOM内容.
如果在JavaScript环境中构建的PhantomJS不包含您需要的某些Node.js组件(例如,对于文件系统或网络访问),您始终可以从Node.js应用程序控制PhantomJS. https://github.com/amir20/phantomjs-node