2016-06-19 2 views
1

나는 웹 사이트를 크롤링 할 필요가있는 스크립트를 가지고있다. 모든 요청 (각 URL)마다, 나는 셀레늄/phantomJS로 새로운 웹 드라이버를 초기화한다. 이 접근 방식은 기어 오를이며 시간이 지남에 따라 CPU 사용량이 많은 비용을 부담해야? 는 차라리 단 하나의 드라이버를 생성하고 전역 변수 어딘가에 저장하고 모든 요청을 재사용해야 하는가? 이렇게하면 CPU 사용량이 줄어들거나 효과가 떨어질까요?PhantomJS의 인스턴스를 여러 개 만들거나 하나만 만들면됩니까?

답변

3

각 요청 (각 URL)마다 셀레늄/팬텀 JS로 새 웹 드라이버를 초기화합니다. 이 접근법은 확장 할 수 없으며 시간이 지남에 따라 많은 CPU 사용량이 들게됩니까?

이것은 확실히 문제입니다. PhantomJS 인스턴스는 일반적으로 CPU에서 무거 우므로 확장 할 수있는 안정적인 방법은 아닙니다. 동일한 "webdriver"인스턴스를 문제없이 또는 성능에 부정적인 영향을주지 않고 재사용 할 수 있다면 그렇게하십시오. 그렇지 않다면 브라우저 인스턴스가 실제로 실행될 수있는 다중 셀 노드가있는 Selenium grid을 만듭니다. 또한 BrowserStack 또는 Sauce Labs 같은 원격 셀레늄 서버를 사용으로 볼 수있다.

1

PhantomJS에는 요청을 실행하고 수신 할 수있는 내장 웹 서버 (Mongoose)가 있습니다. 이렇게하면 매번 초기화 할 필요가 없습니다. 워밍업은 PhantomJS에서 상당히 비쌉니다. 여기

은 당신이 시작할 수 PhantomJS에서 샘플 웹 서버 코드 : 문서에서

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

var your_method = function(data) { 
    # Do stuff here 
}; 

service = server.listen(port, function (request, response) { 
    var input = JSON.parse(request.post); 
    page.open(url, function (status) { 
    page.evaluate(your_method, input) 
}); 

if (service) { 
    console.log('Server running on port ' + port); 
} else { 
    console.log('Error: Could not create web server listening on port ' + port); 
    phantom.exit(); 
} 

;

이는 PhantomJS 스크립트 와 외부 세계 사이의 통신의 편의를위한 것입니다 및 일반 프로덕션 서버로 사용하지 않는 것이 좋습니다. 현재 최대 동시 요청 수는 10 개 ( )입니다. 다른 요청은 대기열에 들어갑니다.

관련 문제