使用PhantomJS进行网络抓取

时间:2014-12-14 17:38:54

标签: javascript web-scraping phantomjs

有没有办法在网页中执行与浏览器完全相同的所有JavaScripts而不指定要执行哪个函数?在我看到的大多数示例中,这些似乎都指定了要从抓取的网页执行的JavaScript部分。我需要抓取所有内容并像浏览器一样执行所有JavaScripts并获取最终执行的代码,我们可以使用google inspect查看?

我确信必须有某种方法,但PhantomJS的示例代码似乎没有任何解决此问题的示例。

2 个答案:

答案 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

你实际上有clickwaitfetchText等功能。

答案 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);