본문 바로가기

Creation/Programming

[PhantomJS] 서버 열고 URL받아 스크랩하기



서버로 URL 받아서 스크랩하기

 

 

  PhantomJS는 Headless Browser라고 하죠. Chrome처럼 Webkit 엔진을 사용한 것으로 알고있는데, 유저 Interface없이 사이트 전체 모습을 캡쳐하기도 하는 등 분석툴로써 활용될 수 있는 프로그램입니다.

  문법을 마치 Node.js처럼 할 수 있어서(아니면 Node.js 기반인가? 이건 잘 모르겠습니다) 서버로 활용이 가능할 것이라는 생각을 하긴 했었는데, 어쨌든 찾아보니까 되더라구요. 어쨌든 아래처럼 사용하였습니다.

 

 


var server = require('webserver').create();
var system = require('system');
var fs = require('fs');
var wait_time = 1000;
var CONST_TIMEOUT_TIMER = 60000;
var host, port;

port = 8080; 
console.log('Server is now opening...')

var listening = server.listen(port, function (request, response) {
    //console.log(JSON.stringify(request, null, 4));
    //console.log(request['headers']['Host']);
    console.log('-------------------------------')
    //console.log('Original Request URL: ' + request.url);
    if (request['headers']['Host'] == ('127.0.0.1:' + port)) { // Internal Only.

        response.statusCode = 200;
        response.headers = {"Cache": "no-cache", "Content-Type": "text/html"};

        mode = getParameterByName('mode', request.url);
        if (mode == 'ping') {
            response.write(scrap_item_queue.length);
            console.log('PONG!');
        } else if (mode =='scrap') {
            url = getParameterByName('scrap_add_url', request.url);
            url = decodeURIComponent(url)
            scrap_desktop = getParameterByName('scrap_desktop', request.url);
            scrap_image = getParameterByName('scrap_image', request.url);
            scrap_mobile = getParameterByName('scrap_mobile', request.url);
            scrap_stock =  getParameterByName('scrap_stock', request.url);
            scrap_stock_code =  getParameterByName('scrap_stock_code', request.url);
            scrap_hash_url = decodeURIComponent(getParameterByName('scrap_hash_url', request.url));
            scrap_hash_time = decodeURIComponent(getParameterByName('scrap_hash_time', request.url));
            console.log('[New Scrap URL Queued] ' + url);

            if (scrap_desktop == 'on' && scrap_image == 'on') {
                scrap_item_queue.push(new scrap_item(
                    url, 'on', scrap_image, 'off', scrap_stock, scrap_stock_code, scrap_hash_url, scrap_hash_time
                ));
                scrap_item_queue.push(new scrap_item(
                    url, 'off', scrap_image, 'on', scrap_stock, scrap_stock_code, scrap_hash_url, scrap_hash_time
                ));
            } else {
                scrap_item_queue.push(new scrap_item(
                    url, scrap_desktop, scrap_image, scrap_mobile, scrap_stock, scrap_stock_code, scrap_hash_url, scrap_hash_time
                ));
            }
            

            response.write('Scrap Work is added!')
        } else {
            response.write('Unknown Command!');
        }
        console.log('Response Close: ' + request.url);
        response.close();

    } else {
        response.statusCode = 200;
        response.headers = {"Cache": "no-cache", "Content-Type": "text/html"};
        response.write('Internal Only.');
        response.close();
    }

});
if (!listening) {
    console.log("could not create web server listening on port " + port);
    phantom.exit();
} 
	


  보시는 것처럼 server.listen을 통해서 callback function을 작성해 사용합니다. Parameter를 받아서 mode에 따라서 스크랩을 할 것인지, 아니면 단순하게 ping인지 등등을 체크합니다. 그리고 스크랩의 모드에 따라서 스크랩할 요소를 정하구요.

  실제 스크랩하는 코드는 conventional code랑 크게 다르지 않습니다. 만약 요청이 있으시다면 이부분도 따로 다뤄보도록 하겠습니다.

  어쨌든 짧은 코드지만, 여실히 backend javascript의 위력을 새삼스럽게 느끼는 부분이 아닌가 싶습니다. 전혀 이질감 없이 코드 작성이 가능했거든요.