📜  PhantomJS-网络监控(1)

📅  最后修改于: 2023-12-03 15:18:18.738000             🧑  作者: Mango

PhantomJS-网络监控

PhantomJS是一个基于WebKit的无头浏览器,可进行自动化的网页截屏、网络监控等功能。在网络监控方面,PhantomJS可以捕获HTTP请求和响应,并生成HAR(HTTP Archive)文件,以便分析和优化页面性能。

安装

PhantomJS可以通过官方网站(http://phantomjs.org/)下载安装包,也可以通过包管理器(如npm)安装。以下是通过npm安装的命令:

npm install phantomjs-prebuilt
使用

使用PhantomJS进行网络监控需要编写一个脚本,在脚本中可以定义需要监控的URL和其他相关参数。以下是一个示例脚本:

var page = require('webpage').create();
var url = 'https://www.example.com';
var har = {};

page.onLoadStarted = function () {
    har.startedDateTime = new Date().toISOString();
};

page.onResourceRequested = function (requestData, networkRequest) {
    var entry = {
        'request': {
            'url': requestData.url,
            'method': requestData.method,
            'httpVersion': 'HTTP/1.1',
            'cookies': [],
            'headers': [],
            'queryString': [],
            'headersSize': -1,
            'bodySize': -1
        },
        'response': {},
        'cache': {},
        'timings': {
            'blocked': -1,
            'dns': -1,
            'connect': -1,
            'send': 0,
            'wait': 0,
            'receive': 0
        },
        'serverIPAddress': ''
    };
    har.log.entries.push(entry);
    networkRequest.setHeaderValue('X-Requested-By', 'PhantomJS');
};

page.onResourceReceived = function (response) {
    var entry = har.log.entries[har.log.entries.length - 1];
    entry.response.status = response.status;
    entry.response.statusText = response.statusText;
    entry.response.httpVersion = 'HTTP/1.1';
    entry.response.cookies = response.cookies;
    entry.response.headers = response.headers;
    entry.response.content = {
        'size': response.bodySize,
        'mimeType': response.contentType || 'text/plain'
    };
    entry.response.redirectURL = response.redirectURL;
    entry.response.statusText = response.statusText;
    entry.cache = {};
    entry.timings.receive = new Date().getTime() - entry._start;
};

page.open(url, function (status) {
    if (status !== 'success') {
        console.log('Unable to access network');
    } else {
        har = {
            'log': {
                'version': '1.2',
                'creator': {
                    'name': 'PhantomJS',
                    'version': phantom.version.major + '.' + phantom.version.minor + '.' + phantom.version.patch
                },
                'entries': []
            }
        };
        har.log.pages = [{
            'startedDateTime': har.startedDateTime,
            'id': page.title,
            'title': page.title,
            'pageTimings': {
                'onContentLoad': -1,
                'onLoad': new Date().getTime() - page.startTime
            }
        }];
        console.log(JSON.stringify(har, undefined, 4));
    }
});

在脚本中,使用require('webpage').create()创建了一个Web页面,定义了要监控的URL,并在页面加载时设置了HAR文件的起始时间。在onResourceRequested()onResourceReceived()函数中,分别捕获HTTP请求和响应,并将它们添加到HAR文件的条目中。最后将HAR文件输出到控制台。

执行以上脚本,即可得到类似以下的HAR文件输出:

{
    "log": {
        "version": "1.2",
        "creator": {
            "name": "PhantomJS",
            "version": "2.1.1"
        },
        "pages": [
            {
                "startedDateTime": "2020-10-31T05:38:12.687Z",
                "id": "Example Domain",
                "title": "Example Domain",
                "pageTimings": {
                    "onContentLoad": -1,
                    "onLoad": 939
                }
            }
        ],
        "entries": [
            {
                "request": {
                    "url": "https://www.example.com/",
                    "method": "GET",
                    "httpVersion": "HTTP/1.1",
                    ...
                },
                "response": {
                    "status": 200,
                    "statusText": "OK",
                    "httpVersion": "HTTP/1.1",
                    ...
                },
                "cache": {},
                "timings": {
                    "blocked": -1,
                    "dns": -1,
                    "connect": -1,
                    "send": 0,
                    "wait": 304,
                    "receive": 34
                },
                "serverIPAddress": ""
            },
            ...
        ]
    }
}
总结

PhantomJS是一个功能强大的无头浏览器,可以进行网络监控等自动化任务。通过编写JavaScript脚本,即可捕获HTTP请求和响应,并生成HAR文件进行分析和优化。可以考虑将PhantomJS结合其他工具,实现更加复杂的自动化任务。