728x90
반응형

특정 사이트에서 로그인을 한 뒤 원하는 데이터를 얻어야 될 경우가 생겼다.

api 사이트를 이용할 경우 편하긴 하지만 트랜젝션이 발생 할 때마다의 비용이 발생하기 때문에 

node.js 에서 사용할 수 있는 puppeteer 를 경험해보기로 했다.

 

1. 필요한 npm 패키지를 설치한다.

$npm i puppeteer

 

2. 함수를 구현한다.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch(); // puppeteer 시작
  const page = await browser.newPage(); // 브라우저 실행
  await page.goto('https://www.google.com'); // 해당 페이지로 이동
  // other actions...
  await browser.close();  // 브라우저 종료
})();

 

이러한 함수를 만들어두고 백엔드에서 api 요청이 들어올 때 원하는 사이트에 접속 후 원하는 데이터를 가져올 수 있게끔 구현하면 된다.

 

예시)

var puppeteer = require('puppeteer');

(async () => {

    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    const hisnet_id = '히즈넷 아이디';
    const hisnet_pw = '히즈넷 비밀번호';

    //페이지로 가라
    await page.goto('https://hisnet.handong.edu/login/login.php');

    //아이디랑 비밀번호 란에 값을 넣어라
    await page.evaluate((id, pw) => {
    document.querySelector('input[name="id"]').value = id;
    document.querySelector('input[name="password"]').value = pw;
    }, hisnet_id, hisnet_pw);

    //로그인 버튼을 클릭해라
    await page.click('input[src="/2012_images/intro/btn_login.gif"]');

    //로그인 화면이 전환될 때까지 .5초만 기다려라
    await page.waitFor(500);

    //로그인 실패시(화면 전환 실패시)
    if(page.url() === 'https://hisnet.handong.edu/login/_login.php'){
        student_id = 'nope';
        name = 'nope';
    }
    //로그인 성공시
    else{
        //학사 페이지로 가서
        await page.goto('https://hisnet.handong.edu/haksa/hakjuk/HHAK110M.php');
        //학번을 가져오고
        const element1 = await page.$('input[name="hakbun"]');
        student_id = await page.evaluate(element1 => element1.value, element1);
        //이름을 가져와라
        const element2 = await page.$('td[width="240"]');
        name = await page.evaluate(element2 => element2.textContent, element2);
    }
    //브라우저 꺼라
    await browser.close();        
})();

 

 

참조

https://zoomkoding.github.io/web/nodejs/histime/2019/01/24/crawler.html

 

줌코딩의 코딩일기

Zoom in Coding from the Basic.

zoomkoding.github.io

 

728x90
반응형

+ Recent posts