[Puppeteer] 퍼펫티어를 이용한 CRAWLING 작업[Puppeteer] 퍼펫티어를 이용한 CRAWLING 작업

Posted at 2019. 4. 26. 16:27 | Posted in Node.js/Puppeteer
반응형





■ 퍼펫티어를 이용한 크롤링 작업





필자가 노드를 처음 접하게된 이유는 급작스러운 크롤링 작업 때문이었다.


당시에는 PhantomJSCasperJS를 통해 작업을 진행 하였고,


왠만학 작업은 위 두개를 가지고 어떻게든 진행 할 수 있었지만.


점점 작업해야하는 프로젝트가 고도화 됨에 따라,


다른 Node.js와의 라이브러리 범용이 어려운 CasperJS의 한계를 느끼게 되었고


Puppeteer를 주로 사용하게 되었다.


Node.js를 통한 크롤링 작업을 준비중인 사람이라면,


그만 퍼펫티어를 더 활용하는것이 스트레스를 덜 받을 것이라고 생각한다.




# 소스 코드

 puppeteer_login.js

const puppeteer = require("puppeteer");


// 사용시 인위적인 딜레이를 주기위한 함수

function delay( timeout ) {

  return new Promise(( resolve ) => {

    setTimeout( resolve, timeout );

  });

}


puppeteer.launch({

  headless : false // 헤드리스모드의 사용여부를 묻는다.

, devtools : true // 개발자 모드의 사용여부를 묻는다.

}).then(async browser => {


const page = await browser.newPage();

// 로그인할 티스토리 블로그의 관리자 페이지를 지정

await page.goto( "http://magic.wickedmiso.com/manage/", { waitUntil : "networkidle2" } );

// 티스토리의 아이디와 암호를 입력한다.

await page.type( "div.box_login > div.inp_text:nth-child(1) > input#loginId", "티스토리 아이디" );

await page.type( "div.box_login > div.inp_text:nth-child(2) > input#loginPw", "티스토리 패스워드" );



/* document.getElementByI로 직접 입력할 input BOX를 선택하여 작업하는 것도 가능하다.

await page.evaluate(() => {

document.getElementById( "div.box_login > div.inp_text:nth-child(1) > input#loginId" ).value = "티스토리 아이디";

                document.getElementById( "div.box_login > div.inp_text:nth-child(2) > input#loginPw" ).value = "티스토리 패스워드";

});

*/


await delay(3000);

        // 로그인 SUBMIT 기능

const elementHandle = await page.waitFor( "input" );

await elementHandle.press( "Enter" );

await delay(5000);

        /* 로그인이후 방문 기록 데이터를 콘솔에 띄워본다. */

const emToDay = await page.waitFor( "div.box_blog > dl.count_visitor:nth-child(1) > dd" );

        const txtToDay = await page.evaluate( emToDay => emToDay.textContent, emToDay );

        console.log("-. 오늘 방문자 수", txtToDay);

    

const emYesterDay = await page.waitFor( "div.box_blog > dl.count_visitor:nth-child(2) > dd" );

        const txtYesterDay = await page.evaluate( emYesterDay => emYesterDay.textContent, emYesterDay );

        console.log("-. 어제 방문자 수", txtYesterDay);


const emCumulativ = await page.waitFor( "div.box_blog > dl.count_visitor:nth-child(3) > dd" );

        const txtCumulativ = await page.evaluateemCumulativ => emCumulativ.textContentemCumulativ );

        console.log("-. 누적 방문자 수", txtCumulativ);

});





# 노드 실행

 C:> node puppeteer_login.js





# 출력 결과











반응형
//