2017-01-30 5 views
1

Ich benutze den Code von netsniff.js, um eine har file zu generieren, und ich möchte es verbessern, um eine har-Datei aus mehreren Links in einem Array (links in meinem unteren Code) zu generieren .Verwenden von phantom.js zum Generieren mehrerer HAR-Dateien

Es ist eine andere Frage hier Using Multiple page.open in Single Script, die mir helfen könnte, aber ich habe keine Ahnung, wie die gegebene Lösung in meinem Code zu implementieren ..

Unten ist mein Code (es meldet sich FAIL to load the address in der Ausgabedatei, wenn der links Array enthält mehr als ein Element):

"use strict"; 
if (!Date.prototype.toISOString) { 
    Date.prototype.toISOString = function() { 
     function pad(n) { return n < 10 ? '0' + n : n; } 
     function ms(n) { return n < 10 ? '00'+ n : n < 100 ? '0' + n : n } 
     return this.getFullYear() + '-' + 
      pad(this.getMonth() + 1) + '-' + 
      pad(this.getDate()) + 'T' + 
      pad(this.getHours()) + ':' + 
      pad(this.getMinutes()) + ':' + 
      pad(this.getSeconds()) + '.' + 
      ms(this.getMilliseconds()) + 'Z'; 
    } 
} 
var entries = []; 
function createHAR(address, title, startTime, resources) 
{ 
    resources.forEach(function (resource) { 
     var request = resource.request, 
      startReply = resource.startReply, 
      endReply = resource.endReply; 

     if (!request || !startReply || !endReply) { 
      return; 
     } 

     // Exclude Data URI from HAR file because 
     // they aren't included in specification 
     if (request.url.match(/(^data:image\/.*)/i)) { 
      return; 
     } 

     entries.push({ 
      startedDateTime: request.time.toISOString(), 
      time: endReply.time - request.time, 
      request: { 
       method: request.method, 
       url: request.url, 
       httpVersion: "HTTP/1.1", 
       cookies: [], 
       headers: request.headers, 
       queryString: [], 
       headersSize: -1, 
       bodySize: -1 
      }, 
      response: { 
       status: endReply.status, 
       statusText: endReply.statusText, 
       httpVersion: "HTTP/1.1", 
       cookies: [], 
       headers: endReply.headers, 
       redirectURL: "", 
       headersSize: -1, 
       bodySize: startReply.bodySize, 
       content: { 
        size: startReply.bodySize, 
        mimeType: endReply.contentType 
       } 
      }, 
      cache: {}, 
      timings: { 
       blocked: 0, 
       dns: -1, 
       connect: -1, 
       send: 0, 
       wait: startReply.time - request.time, 
       receive: endReply.time - startReply.time, 
       ssl: -1 
      }, 
      pageref: address 
     }); 
    }); 

    return { 
     log: { 
      version: '1.2', 
      creator: { 
       name: "PhantomJS", 
       version: phantom.version.major + '.' + phantom.version.minor + 
        '.' + phantom.version.patch 
      }, 
      pages: [{ 
       startedDateTime: startTime.toISOString(), 
       id: address, 
       title: title, 
       pageTimings: { 
        onLoad: page.endTime - page.startTime 
       } 
      }], 
      entries: entries 
     } 
    }; 
} 
var page = require('webpage').create() 
var fs = require('fs'); 
var count = 0; 
function processSites(links) 
{ 
    page.address = links.pop(); 
    var path = 'file' + count + '.har'; 
    page.resources = []; 
    console.log("page resources:", page.resources) 
    count = count + 1; 
    page.onLoadStarted = function() { 
     page.startTime = new Date(); 
    }; 
    page.onResourceRequested = function (req) { 
     page.resources[req.id] = { 
      request: req, 
      startReply: null, 
      endReply: null 
     }; 
    }; 

    page.onResourceReceived = function (res) { 
     if (res.stage === 'start') { 
      page.resources[res.id].startReply = res; 
     } 
     if (res.stage === 'end') { 
      page.resources[res.id].endReply = res; 
     } 
    }; 

    page.open(page.address, function (status) { 
     var har; 
     setTimeout(function() { 
      if (status !== 'success') { 
       console.log('FAIL to load the address'); 
       phantom.exit(1); 
      } else { 
       page.endTime = new Date(); 
       page.title = page.evaluate(function() { 
        return document.title; 
       }); 
       entries = []; 
       har = createHAR(page.address, page.title, page.startTime, page.resources); 
       // console.log(JSON.stringify(har, undefined, 4)); 
       fs.write(path, JSON.stringify(har), 'w'); 

       if(links.length > 0) 
       { 
        processSites(links); 
       } 
       else 
       { 
        phantom.exit(); 
       } 
      } 
     }, 10000); 
    }); 

} 

var links = ["http://stackoverflow.com", "http://marvel.com"]; 

processSites(links); 

Update:
der obige Code erzeugen zwei har Dateien file1.har und file2.har, aber die zweite har-Datei enthält auch den har Code aus beiden Verbindungen erzeugt, und es sollte nur haben der har Code für den ersten Link ...

dieses Fest von var har = " "

Antwort

2

Einstellung Sie können nicht iterieren Seiten in PhantomJS in einer einfachen Schleife zu öffnen, weil page.open Methode asynchron ist. Es wartet nicht darauf, dass die erste Seite bearbeitet wird, und öffnet sofort die zweite.

Ich habe Ihr Skript neu geschrieben, um die Rekursion zu verwenden: Die nächste Seite wird erst geöffnet, nachdem der aktuelle Datensatz verarbeitet wurde. (Hinweis: Wenn einer der Standorte in der Warteschlange nicht geladen werden kann, wird der gesamte Prozess angehalten, aber Sie können das Skript einfach neu schreiben, um dies zu vermeiden).

if (!Date.prototype.toISOString) { 
    Date.prototype.toISOString = function() { 
     // ... 
    } 
} 

var entries = []; 

function createHAR(address, title, startTime, resources) 
{ 
    // ... 
} 

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

function processSites(links) 
{ 
    page.address = links.pop(); 

    console.log("PAGE ADDRESS: ", page.address); 
    page.resources = []; 

    page.onLoadStarted = function() { 
     page.startTime = new Date(); 
    }; 
    page.onResourceRequested = function (req) { 
     page.resources[req.id] = { 
      request: req, 
      startReply: null, 
      endReply: null 
     }; 
    }; 

    page.onResourceReceived = function (res) { 
     if (res.stage === 'start') { 
      page.resources[res.id].startReply = res; 
     } 
     if (res.stage === 'end') { 
      page.resources[res.id].endReply = res; 
     } 
    }; 

    page.open(page.address, function (status) { 
     var har; 
     setTimeout(function() { 
      if (status !== 'success') { 
       console.log('FAIL to load the address'); 
       phantom.exit(1); 
      } else { 
       page.endTime = new Date(); 
       page.title = page.evaluate(function() { 
        return document.title; 
       }); 
       har = createHAR(page.address, page.title, page.startTime, page.resources); 
       console.log(JSON.stringify(har, undefined, 4)); 

       if(links.length > 0) 
       { 
        processSites(links); 
       } 
       else 
       { 
        phantom.exit(); 
       } 
      } 
     }, 10000); 
    }); 

} 

var links = ["http://edition.cnn.com", "http://stackoverflow.com"]; 

processSites(links); 
+1

Ich fand, dass die Har-Datei für '" http://edition.cnn.com "' auch den für '" http://Stackoverflow.com "generierten Har-Code enthalten wird" ... ist da eine Möglichkeit, den har-Code individuell auszugeben? – Valip

+1

Vaviloff kannst du mir immer noch dabei helfen? Ich habe die Frage aktualisiert. Vielen Dank! – Valip

+1

Vielleicht 'var entries = [];' sollte innerhalb der 'createHar' Funktion sein? Ich habe nicht wirklich viel darüber gelesen, die Frage war, ob man über ein Array von Links iterieren sollte und keine har-Dateien per se erstellen sollte. – Vaviloff

Verwandte Themen