如何为搜索引擎优化PhantomJS以索引单页应用程序?

时间:2013-07-28 21:46:25

标签: selenium phantomjs htmlunit single-page-application headless-browser

我一直在寻找可在服务器上运行的无头网络浏览器,以便网络抓取工具为单个页面应用程序编制索引。 Firslyt我尝试了HTMLUnit和Selenium(HtmlUnitDriver)但似乎它们都有xhr请求的问题。

我发现PhantomJS表现更好,看起来更成熟。 PhantomJS有一个internal webserver所以我决定将它与我的反向代理一起使用。然而,我运行了一个基准测试,PhantomJS 100%点击cpu核心,平均页面加载时间约为4秒。原因是我必须等待浏览器加载所有资源才能获得正确的结果。这是我的PhantomJS脚本:

var page = require('webpage');
var system = require('system');
var server = require('webserver').create();

// credit: http://backbonetutorials.com/seo-for-single-page-apps/
var service = server.listen(port, { 'keepAlive': true }, function(z, response) {
    var request = page.create();
    var lastReceived = new Date().getTime();
    var requestCount = 0;
    var responseCount = 0;
    var requestIds = [];
    var startTime = new Date().getTime();
    request.onResourceReceived = function (response) {
        if (requestIds.indexOf(response.id) !== -1) {
            lastReceived = new Date().getTime();
            responseCount++;
            requestIds[requestIds.indexOf(response.id)] = null;
        }
    };
    request.onResourceRequested = function (request) {
        if (requestIds.indexOf(request.id) === -1) {
            requestIds.push(request.id);
            requestCount++;
        }
    };
    request.settings = { 
      loadImages: false, 
      javascriptEnabled: true,
      loadPlugins: false 
    };
    request.open(z.url, function (status, a) {
        if (status !== 'success') {
            console.log('FAIL to load the address '+a);
        }
    });
    var checkComplete = function () {
        var now = new Date().getTime();
        if ((now - lastReceived > 300 && requestCount === responseCount) || now - startTime > 5000) {
            clearInterval(checkCompleteInterval);
            response.statusCode = 200;
            response.headers = {
                'Cache': 'no-cache',
                'Content-Type': 'text/html; charset=UTF-8',
                'Connection': 'Keep-Alive',
                'Keep-Alive': 'timeout=5, max=100',
                'Content-Length': request.content.length
            };
            response.write(request.content);
            response.close();
            request.release();
            console.log(request.url+" -> "+(now - startTime));
        }
    }
    var checkCompleteInterval = setInterval(checkComplete, 3);

});

如果我只是使用shell命令运行PhantomJS以获得更好的性能,或者有没有替代这些浏览器的话,是否可以对加速脚本进行任何改进?

1 个答案:

答案 0 :(得分:3)

您可以使用一些command line switches来提高捕获性能:

首先,您可以使用--load-images=no忽略所有图片。在执行HTML快照时无需加载图像。

您还可以使用--disk-cache=yes启用缓存(使用--max-disk-cache-size设置其大小(以字节为单位)

最后,WebPage#onResourceRequested回调对于使用NetworkRequest#abort方法中止某些请求(跟踪器,媒体文件......)也很有用。