有没有办法在网页中执行与浏览器完全相同的所有JavaScripts而不指定要执行哪个函数?在我看到的大多数示例中,这些似乎都指定了要从抓取的网页执行的JavaScript部分。我需要抓取所有内容并像浏览器一样执行所有JavaScripts并获取最终执行的代码,我们可以使用google inspect查看?
我确信必须有某种方法,但PhantomJS的示例代码似乎没有任何解决此问题的示例。
答案 0 :(得分:2)
您没有使用PhantomJS指定从页面执行的内容。您使用PhantomJS打开页面,并且在Chrome或Firefox中执行的所有JavaScript也在PhantomJS中执行。它是一个完整的浏览器,没有" head"。
虽然存在一些差异。单击下载链接不会触发下载。 PhantomJS 1.x基于的渲染引擎已有近4年的历史,因此有些页面的呈现方式不同,因为PhantomJS 1.x可能不支持该功能。 (PhantomJS 2正在进行中,现在处于非官方状态" alpha"状态)
因此,您需要使用JavaScript或CoffeeScript编写用户在页面上执行的每个交互的脚本。你不打电话给页面功能。您可以操纵DOM元素来模拟在浏览器中与页面交互的用户。这需要以这样的粗方式完成,因为PhantomJS API不提供高级用户类功能。如果你想要那些,你必须看看构建在PhantomJS / SlimerJS之上的CasperJS。
你实际上有click
,wait
,fetchText
等功能。
答案 1 :(得分:0)
这将有效,将其放在名为“scrape.js”的文件中,并使用phantomjs执行它。将您的网址作为第一个网址传递
// Usage: phantomjs scrape.js http://your.url.to.scrape.com
"use strict";
var sys = require("system"),
page = require("webpage").create(),
logResources = false,
url = sys.args[1]
//console.log('fetch from', url);
function printArgs() {
var i, ilen;
for (i = 0, ilen = arguments.length; i < ilen; ++i) {
console.log(" arguments[" + i + "] = " + JSON.stringify(arguments[i]));
}
console.log("");
}
////////////////////////////////////////////////////////////////////////////////
page.onLoadFinished = function() {
page.evaluate(function() {
console.log(document.body.innerHTML);
});
};
// window.console.log(msg);
page.onConsoleMessage = function() {
printArgs.apply(this, arguments);
phantom.exit(0);
};
////////////////////////////////////////////////////////////////////////////////
page.open(url);