2

웹 크롤러가 단일 페이지 응용 프로그램의 색인을 생성 할 수 있도록 서버에서 실행할 수있는 헤드리스 웹 브라우저를 찾고 있습니다. Firslyt HTMLUnit과 Selenium (HtmlUnitDriver)을 시도했지만 두 가지 모두 xhr 요청에 문제가있는 것으로 보입니다.검색 엔진에서 PhantomJS를 최적화하여 단일 페이지 응용 프로그램의 색인을 생성하는 방법은 무엇입니까?

그리고 더 잘 수행되고 성숙한 PhantomJS를 발견했습니다. PhantomJS는 internal webserver이므로 역 프록시로 사용하기로했습니다. 그러나 벤치 마크를 실행하고 PhantomJS는 CPU 코어 100 %를 기록하고 평균 페이지 로딩 속도는 약 4 초입니다. 그 이유는 올바른 결과를 얻을 수 있도록 모든 리소스를로드하기 위해 브라우저를 기다려야하기 때문입니다.

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

}); 

스크립트 속도를 위해 할 수있는 모든 개선, 난 그냥 성능 향상을 위해 껍질 명령을 사용하여 PhantomJS를 실행해야합니다 있나요 또는이는이 브라우저에 대한 대안 : 여기 내 PhantomJS 스크립트입니다?

첫째, 당신은 --load-images=no 모든 이미지를 무시할 수 있습니다 :

답변

3

당신은 캡처 성능을 개선하는 데 도움이되는 몇 가지 command line switches를 사용할 수 있습니다. HTML 스냅 샷을 수행 할 때 이미지를로드 할 필요가 없습니다.

또한

마지막으로, WebPage#onResourceRequested 콜백도 일부 요청 (추적기, 미디어 파일을 ...) 중단하는 것이 유용 할 수 있습니다 --disk-cache=yes와 캐시 (바이트의 크기를 설정할 수 --max-disk-cache-size를 사용)를 활성화 할 수 있습니다 NetworkRequest#abort 방법.

+0

흠, 나는 이미 loadImages를 false로 설정하지 않았으므로 첫 번째 조언은 필요하지 않습니다. –

+0

NetworkRequest # 중단 도움말 주셔서 감사합니다. 이 경우에는 Facebook API 및 분석 API가 필요하지 않으므로 스크립트가 더 빨라졌습니다. –

관련 문제