[Puppeteer] evaluate() 함수에 변수 전달하기[Puppeteer] evaluate() 함수에 변수 전달하기

Posted at 2019. 9. 30. 19:49 | Posted in Node.js/Puppeteer




참고 : https://code-examples.net/ko/q/2bf409f






■ evaluate( ) 함수에 변수 전달하기




이전 [Puppeteer] 퍼펫티어를 이용한 CRAWLING 작업 포스팅에서


티스토리 로그인을 하는 예제를 조금 수정하여 작업을 진행한다.


해당 포스팅에서는 자바스크립트의 코드를 사용 할 수 있게 해주는


evaluate( ) 함수가 존재하고,


해당 evaluate( ) 함수에 변수값을 사용하는데 있어 아래와 같이 사용 한 경우 에러가 발생하였다.



 puppeteer_evaluate.js

const puppeteer = require("puppeteer");

// 사용시 인위적인 딜레이를 주기위한 함수
function delay( timeout ) {
return new Promise(( resolve ) => {
setTimeout( resolve, timeout );
});
}

puppeteer.launch( { headless : true } ).then(async browser => {

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

let magicId = "tistoryId";      // 티스토리 아이디
let magicPw = "tistoryPw";    // 티스토리 패스워드

await page.evaluate(() => {
        document.getElementById( "loginId" ).value = magicId;
        document.getElementById( "loginPw" ).value = magicPw;
});

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


});



# 에러 출력





evaluate( ) 함수 이기 때문에 해당 함수내에 값을 전달할려면


다른 함수들과 마찬가지로 전달할 값을 오버라이딩 해서 매개변수값을 전달해 주어야 한다.



 puppeteer_evaluate.js

const puppeteer = require("puppeteer");

// 사용시 인위적인 딜레이를 주기위한 함수
function delay( timeout ) {
return new Promise(( resolve ) => {
setTimeout( resolve, timeout );
});
}

puppeteer.launch( { headless : false } ).then(async browser => {

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

let magicId = "tistoryId";      // 티스토리 아이디
let magicPw = "tistoryPw";    // 티스토리 패스워드
       

        // 함수내에 매개변수를 지정해준다.

     await page.evaluate(( { magicId, magicPw } ) => {
        document.getElementById( "loginId" ).value = magicId;
        document.getElementById( "loginPw" ).value = magicPw;
// document.getElementsByClassName( "btn_login" ).disabled = false;
}, { magicId, magicPw } );


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


});



위 코드를 실행시켜보면.


이제 위와 같은 에러가 나타나지 않는것을 확인 할 수 있다.


출력결과는 아래와 같다.




# 실행 결과



다시한번 evaluate( )는 함수임을 기억하자.










# 참고




티스토리의 아이디, 패스워드 입력창의 경우


키보드 입력으로 판단되지 않았기 때문에.


로그인 버튼이 활성화 되지 않은 것을 확인 되었다.


이때는 Puppeteer의 키보드 입력과 같은 이벤트를 발생시켜서 처리할 수 있게끔 작업을 진행해 주어야 한다.






Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

[Ubunt] CRON을 이용한 반복작업 수행하기[Ubunt] CRON을 이용한 반복작업 수행하기

Posted at 2019. 9. 29. 15:49 | Posted in Linux/Ubuntu




참고 : https://soooprmx.com/archives/6786

참고 : https://webdir.tistory.com/174

참고 : https://blog.naver.com/tyboss/70048237053

참고 : https://jhnyang.tistory.com/68




리눅스에 크론의 사용법에는 /etc/crontab을 직접 수정하는 방법과


crontab -e 로 등록하는 방법 두가지로 나뉘며


두 방식은 설정하는 방법과 동작이 다르다.


해당 포스팅은 /etc/crontab 에서 직접 수정하여 사용하는 방법을 다룬다.







■ 크론이란?



-. CRON은 유닉스 사용자로 하여금 특정한 명령이나 스크립트를 지정한 시간 / 날짜에 자동으로 실행하게 해주는 프로그램의 이름이다.


-. 주기적으로 시스템 백업 스크립트를 실행하는 등 시스템 관리자에 의해 많이 사용되며, 그 외에도 특정한 작업을 스케줄링하기 위해 사용될 수 있다.


-. 최근에는 자동으로 인터넷에 접속해서 이메일을 다운로드 받는 등의 용도로 쓰이기도 한다.




# 실행된 크론 이력 확인하기

 $ ps aux | grep crond




-. CRON은 일종의 데몬이다. 즉 한 번 실행되면 시스템에 상주하며 필요할 때마다 동작한다.


-. 비슷한 예로 웹서버도 일종의 데몬으로 웹페이지에 대한 요청이 들어올 때만 작동한다.


-. 데몬 크론은 crond라는 이름을 갖는데, 설정 파일 혹은 crontab에 기록된 날짜나 시간이 될 때까지 기다린 다음 동작을 시작한다.


-. 대부분의 유닉스 배포판에서 crond는 이미 포함되어 있고, 시작 스크립트에 기록되어 있다.








■ 크론 세팅하기




VIM을 사용하여 crontab을 수정한다.


 $ sudo vim /etc/crontab



위와 같이 crontab 창이 열리면


# m h dom mon dow user command 라는 주석 아래로


실행 명령들이 쭉 적혀있는 것을 볼 수 있다.


작성 방법은 아래와 같다.



 crontab 설정방법

설명

 * * * * *(실행주기) 사용자계정 명령어 /home/사용자계정/실행파일.sh

샘플

 00 * * * * saak sh /home/saak/shell_script.sh

※ 샘플의 명령은 매시 정각마다 shell_script.sh 파일을 saak 사용자의 권한으로 실행한다라는 의미이다.



위와 같이 작성해 주면 되는데.


실행주기를 뜯하는 에스터리스크( * )기호와

 

명령 권한을 가지는 사용자 계정


실행 명령어 혹은 실행될 스크립트 파일을 지정해준다.

(되도록이면 쉘 스크립트.sh 파일을 만들어서 진행을 해주는것이 좋다.)




# CRON 환경변수 설명

순 서

설    명

Minute

 · 분(Minute)을 나타내며, 몇 분에 실행될 것인지를 정의한다.

 · 00 ~ 59 사이의 숫자값을 사용한다.

Hour

 · 시(Hour)을 나타내며, 몇 시에 실행될 것인지를 정의한다.

 · 00 ~ 23 사이의 숫자값을 사용한다.

Dom

 · 일(Day of Month)을 나타내며, 몇 일에 실행될 것인지를 정의한다.

 · 1 ~ 31 사이의 숫자값을 사용한다.

Month

 · 월(Month)을 나타내며, 몇 월에 실행될 것인지를 정의한다.

 · 1 ~ 12 사이의 숫자값을 사용한다.

 · 숫자 이외의 월의 영문자를 사용할 수 있다.
   ( 1월 : jan, 2월 : feb, 3월 : mar, 4월 : apr, 5월 : may, 6월 : jun,

     7월 : jul, 8월 : aug, 9월 : sep, 10월 : oct, 11월 : nov, 12월 : dec )

Dow

 · 요일(Day of Week)을 나타내며, 실행될 것인지를 정의한다.

 · 0 ~ 6 사이의 숫자값을 사용한다.

 · 숫자 이외의 요일의 영문자를 사용할 수 있다.
   ( 일요일 : sun, 월요일 : mon, 화요일 : tue, 수요일 : wed, 목요일 : thu, 금요일 : fri, 토요일 : sat )

Usr

 · 명령을 실행할 사용자를 지정한다.

 · user-name 사용자 이름을 입력한다.

 · 되도록이면 root(관리자)보단 권한을 가지고 있는 사용자를 지정하는 것이 좋다.

Cmd

 · 실행할 명령을 작성한다.




모든 설정이 완료되면 CRON을 한번 재시작 시켜준다.


 $ sudo service cron reload

 $ sudo service cron restart










■ 크론 실행주기 사용예제




크론의 실행주기 (Minute), (Hour), (Dom), (Month), 요일(Dow)의 값을 설정할때.

몇가지 방법을 통해 실행주기를 설정할 수 있다.

먼저 CRON에서 연산기호를 사용하는 방법을 알아보자.



# CRON 연산기호 사용방법

기 호

설    명

*

 · 각 필드 자리에 에스터리스크( * ) 기호가 오면 해당 필드의 모든 값을 의미한다.
   예를 들어 Hour 필드에 *가 오면 매 시간, Month 필드는 매 일, Dow 필드의 *는 매월을 의미한다.

-

 · 하이픈( - ) 기호는 숫자와 숫자 사이에 사용되어 해당 숫자들 사이의 값을 구한다.

   예를 들어 1-10이라고 표현하면 1부터 10사이의 모든 값을 의미한다.

,

 · 콤마( , ) 기호는 지정한 값의 구분을 위해 사용된다.

 · 주로 불규칙한 값을 지정할때 사용된다.

   예를 들어 Hour 필드에 2, 3 ,5라고 입력하면 2시, 3시 5시에 실행된다.

/

 · 슬래시( / ) 기호는 연결된 설정 값 범위에서 특정 주기로 나눌 때 사용합니다.



위의 기호를 확인 했다면 아래의 예를 살펴보도록 하자.



① 9시부터 17시 사이의 시간에 매 15분간격으로 실행

실행주기

      */15    9-17    *    *    *



② 매월 1~15일 20~25일 그리고 17일의 정오에 실행

실행주기

     *    12    1-15,17,20-25    *    *



③ 10일, 12일, 14일, 16일 17시마다 실행

실행주기

     *    17    10-16/2    *    *



④ 매일 평일 오후1시에 실행

실행주기

     *    13    *    *    mon,tue,wed,thu,fri
     *    13    *    *    1,2,3,4,5
     *    13    *    *    1-5



⑤ 매달 16일이나, 매주 월요일 1시에 실행

실행주기

     *    1    16    *    *
     *    1    *    *    mon

※ 해당 예제와 같이 요일, 날짜등이 동시에 설정된 경우에는 두 조건 중 한 조건을 만족하면 실행된다.
   매달 16일과, 월요일이라는 두개의 설정을 하나로 압축한 예제이다.









Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기