2013-12-23 5 views
3

PhantomJS를 사용하여 웹 위치를 평가하고 출력을 처리하기 위해 파일에 저장하는 솔루션을 구현하려고합니다. 특히 악의적 인 스크립트를 검사합니다. 필자는 한번 PhantomJS를 사용하여 솔루션을 구현할 수있었습니다. 예를 들어 이것은 내가 지속적으로 오버 헤드의 공정한 조금을 가지고있는 다시 시작해야 PhantomJS을 필요로하지 않습니다 엄청난 어려움을 만들려고하고 자동화 된 시스템이 있었다, 그러나 ... 완벽Phantomjs 프로세스 간 통신

var system = require('system'); 
var page = require('webpage').create(); 
var lastReceived = new Date().getTime(); 
var requestCount = 0; 
var responseCount = 0; 
var requestIds = []; 
var fileSystem = require('fs'); 
var startTime = new Date().getTime(); 

page.onResourceReceived = function (response) { 
    if(requestIds.indexOf(response.id) !== -1) { 
     lastReceived = new Date().getTime(); 
     responseCount++; 
     requestIds[requestIds.indexOf(response.id)] = null; 
    } 
}; 
page.onResourceRequested = function (request) { 
    if(requestIds.indexOf(request.id) === -1) { 
     requestIds.push(request.id); 
     requestCount++; 
    } 
}; 

page.open('http://adserver.example.com/adserve/;ID=164857;size=300x250;setID=162909;type=iframe', function() {}); 

var checkComplete = function() { 
    // We don't allow it to take longer than 5 seconds but 
    // don't return until all requests are finished 
    if((new Date().getTime() - lastReceived > 300 && requestCount === responseCount) || new Date().getTime() - startTime > 5000) { 
     clearInterval(checkCompleteInterval); 
     console.log(page.content); 
     phantom.exit(); 
    } 
} 

var checkCompleteInterval = setInterval(checkComplete, 1); 

작동합니다. 명명 된 파이프를 사용하여 읽은 다음 전달 된 URL을 열려고 시도했지만 어떤 이유로 제대로 열리지 않습니다. 나는 이것에 대한 어떤 조언도 감사하고 깊이 감사 할 것입니다.

답변

5

언급해야 할 것은 PhantomJS가 HTTP 통신에 뛰어나다는 것입니다. 그래서 고급 기능을 위해 & 성능이 더 우수합니다. 항상 리소스 풀링 패턴 + 웹 서버 모듈을 사용합니다. 이 모듈은 여전히 ​​실험적 태그가 붙어 있지만, 지금까지는 꽤 안정적이었습니다.

그래서 저는 귀하의 경우에 파일 IO보다 HTTP를 통해 통신하는 것이 더 좋습니다. 이 문제에 훌륭하게 측면 접근 방식이다

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

if (system.args.length !== 2) { 
    console.log('Usage: server.js <some port>'); 
    phantom.exit(1); 
} else { 
    port = system.args[1]; 
    var listening = server.listen(port, function (request, response) { 
     var page=require('webpage').create(); 
     page.open(request.post.target, function(status){ 
      response.write("Hello "+page.title); 
      response.close(); 
     }); 
    }); 
    if (!listening) { 
     console.log("could not create web server listening on port " + port); 
     phantom.exit(); 
    } 

    //test only 
    var url = "http://localhost:" + port + "/"; 
    console.log("SENDING REQUEST TO:"); 
    console.log(url); 
    var data='target=http://stackoverflow.com/'; 
    page.open(url,'post', data, function (status) { 
     if (status !== 'success') { 
      console.log('FAIL to load the address'); 
     } else { 
      console.log("GOT REPLY FROM SERVER:"); 
      console.log(page.content); 
     } 
     phantom.exit(); 
    }); 
} 
+0

:

여기에 매우 기본적인 예입니다! –