vue离开页面事件 - 执行页面的javascript后保存页面的html输出




onunload (5)

这可以通过一些PHP代码轻松完成,javascript使用fopen()和fwrite()以及此函数来保存它:var generatedSource = new XMLSerializer()。serializeToString(document);

https://code.i-harness.com

有一个我试图抓取的网站,首先加载一个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();
});

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

谢谢


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

  • 1.HTML
  • export.png

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


我尝试了几种类似任务的方法和使用Selenium获得的最佳结果。

在我尝试PhantomJS和Cheerio之前。 在页面上执行JS时,Phantom经常崩溃。


我想到的一种方法是,除了使用无头浏览器之外,显然是模拟ajax调用并对页面进行后处理,按请求进行请求..但这通常有点棘手,应该作为最后的手段使用,除非你真的喜欢挖掘javascript代码..


经过两天漫长的挣扎和挫折之后,我终于解决了类似问题。 伎俩是PhantomJS官方网站上waitfor.js示例。 要开心!

"use strict";

function waitFor(testFx, onReady, timeOutMillis) {
    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3000, //< Default Max Timout is 3s
        start = new Date().getTime(),
        condition = false,
        interval = setInterval(function() {
            if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
                // If not time-out yet and condition not yet fulfilled
                condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
            } else {
                if(!condition) {
                    // If condition still not fulfilled (timeout but condition is 'false')
                    console.log("'waitFor()' timeout");
                    phantom.exit(1);
                } else {
                    // Condition fulfilled (timeout and/or condition is 'true')
                    console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
                    typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
                    clearInterval(interval); //< Stop this interval
                }
            }
        }, 250); //< repeat check every 250ms
};


var page = require('webpage').create();

// Open Twitter on 'sencha' profile and, onPageLoad, do...
page.open("http://twitter.com/#!/sencha", function (status) {
    // Check for page load success
    if (status !== "success") {
        console.log("Unable to access network");
    } else {
        // Wait for 'signin-dropdown' to be visible
        waitFor(function() {
            // Check in the page if a specific element is now visible
            return page.evaluate(function() {
                return $("#signin-dropdown").is(":visible");
            });
        }, function() {
           console.log("The sign-in dialog should be visible now.");
           phantom.exit();
        });
    }
});




headless-browser