执行页面的javascript后保存页面的html输出

gya*_*guy 49 javascript headless-browser phantomjs

有一个我试图抓取的网站,首先加载一个html/js使用js然后POST修改表单输入字段.如何获取POSTed页面的最终html输出?

我尝试用phantomjs做这个,但它似乎只有渲染图像文件的选项.谷歌搜索表明它应该是可能的,但我无法弄清楚如何.我的尝试:

var page = require('webpage').create();
var fs = require('fs');
page.open('https://www.somesite.com/page.aspx', function () {
    page.evaluate(function(){

    });

    page.render('export.png');
    fs.write('1.html', page.content, 'w');
    phantom.exit();
});
Run Code Online (Sandbox Code Playgroud)

这段代码将用于客户端,我不能指望他安装太多的包(nodejs,casperjs等)

谢谢

小智 26

您拥有的输出代码是正确的,但同步性存在问题.在页面加载完成之前,您正在执行输出行.你可以绑定onLoadFinished回调来找出发生的时间.请参阅下面的完整代码

    var page = new WebPage()
    var fs = require('fs');

    page.onLoadFinished = function() {
      console.log("page load finished");
      page.render('export.png');
      fs.write('1.html', page.content, 'w');
      phantom.exit();
    };

    page.open("http://www.google.com", function() {
      page.evaluate(function() {
      });
    });
Run Code Online (Sandbox Code Playgroud)

当使用像谷歌这样的网站时,它可能是欺骗性的,因为它加载得如此之快,以至于你可以像往常一样执行屏幕内嵌.时间在phantomjs中是一件棘手的事情,有时我会用setTimeout测试时间是否有问题.


小智 4

当我直接复制你的代码并将URL更改为www.google.com时,它工作正常,保存了两个文件:

  • 1.html
  • 导出.png

请记住,这些文件将写入您运行脚本的位置,而不是您的 .js 文件所在的位置