![[NestJS] 에서 puppeteer 사용하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbGHpau%2FbtrWv7bDpKZ%2FAAAAAAAAAAAAAAAAAAAAAECkJwvgOxjUi38y17EkX8Y-uwbGRupIQg-iiFyA9g7R%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DgtQUejrroOZRm9GR6pfVsbC35H4%253D)
[NestJS] 에서 puppeteer 사용하기Node.js2022. 10. 22. 16:00
      Table of Contents
        
[추천글] 크롤러 성능향상, 이미지 수신 차단
대학교 애플리케이션에 정보시스템의 정보를 크롤링하는 기능을 구현했다.
크롤러는 다른분한테 들은 Node.js 크롤러인 puppeteer을 이용했다.
yarn add puppeteer
yarn add @types/puppeteer이 둘을 설치한 후 service에만 puppeteer을 임포트해서 사용할 수 있다.
사용법
https://github.com/puppeteer/puppeteer
GitHub - puppeteer/puppeteer: Headless Chrome Node.js API
Headless Chrome Node.js API. Contribute to puppeteer/puppeteer development by creating an account on GitHub.
github.com
여기 있는 기본 기능들만 이용하였다.
inje-information-service.service.ts
import {Injectable} from "@nestjs/common";
import * as puppeteer from "puppeteer";
import {UserNotFoundException} from "../../domain/errors/user.errors";
import {IjisLoginCommand} from "./ijis.command";
@Injectable()
export class InjeInformationServiceService {
    async login(body: IjisLoginCommand): Promise<boolean> {
        if (!await this.validateUser(body)) throw new UserNotFoundException();
        const url = 'https://stud.inje.ac.kr/';
        const browser = await puppeteer.launch(
            {
                headless: false,
                waitForInitialPage: true,
            }
        );
        const page = await browser.newPage();
        await page.goto(url, {waitUntil: 'networkidle2'});
        await page.type('#IjisUserID', `${body.studentId}`)
        await page.type('#IjisPassword', `${body.password}`)
        await Promise.all([
            page.click('#ibtnLogin'),
            page.waitForNavigation({waitUntil: 'networkidle2'})
        ]);
        const result = page.url();
        await browser.close();
        return result == 'https://stud.inje.ac.kr/Main.aspx';
    }
    async validateUser(body: {studentId: string, password: string}): Promise<boolean> {
        const url = 'https://edu.inje.ac.kr/default.aspx';
        const browser = await puppeteer.launch(
            {
                headless: false,
                waitForInitialPage: true,
            }
        );
        const page = await browser.newPage();
        await page.goto(url, {waitUntil: 'networkidle2'});
        if (await page.$('#popupLayer58 > div.popup_footer > div > div > a') !== null) await page.click('#popupLayer58 > div.popup_footer > div > div > a');
        await Promise.all([
            await page.type('#txtUserID', `${body.studentId}`),
            await page.type('#txtPasswd', `${body.password}`)
        ]);
        await Promise.all([
            page.click('#btn로그인', {delay: 1000}),
            page.waitForNavigation({waitUntil: 'networkidle2'})
        ]);
        const result = page.url();
        await browser.close();
        return result == 'https://edu.inje.ac.kr/student/default.aspx';
    }
}
'Node.js' 카테고리의 다른 글
| [NestJS] 쿠키와 세션이란? (0) | 2022.11.19 | 
|---|---|
| [NestJS] TypeORM 논리 삭제(soft delete)와 물리 삭제(hard delete) (0) | 2022.11.09 | 
| [NestJS] Swagger 바디 타입 여러개 명시하기 (0) | 2022.10.17 | 
| [NestJS] e2e테스트 Jest 테스트 시 DB 초기화하는 법 (0) | 2022.10.07 | 
| NestJS + Flutter 카카오 OAuth 로그인 구현하기 (0) | 2022.09.24 | 
@임채성 :: 푸르고 개발 블로그
            글 내용 중 잘못되거나 이해되지 않는 부분은 댓글을 달아주세요! 감사합니다! 문의: puleugo@gmail.com
![[NestJS] 쿠키와 세션이란?](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FesGQJC%2FbtrRyHpf8q2%2FAAAAAAAAAAAAAAAAAAAAAGep8TuE47S9pkqK3wOO3u4OLD1o8tAkycnNSrSK26zA%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DSQX5v%252FbDaESp4SKqSL8fUtbjqOg%253D) 
                  ![[NestJS] TypeORM 논리 삭제(soft delete)와 물리 삭제(hard delete)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FFaGv1%2FbtrWyNW11I3%2FAAAAAAAAAAAAAAAAAAAAAFEmX35j6uMbxSPNKXx_-e0CdxzWFfR_ATLbJziZrtpS%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DPrDG0TDSrcyTgipoDpcrr1h%252FyHI%253D) 
                  ![[NestJS] Swagger 바디 타입 여러개 명시하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FccbD0n%2FbtrOQjCXt5v%2FAAAAAAAAAAAAAAAAAAAAAIAR8k5Uea3QmwhcxB-vfF9r8atCVf-rEPALYqmbNujU%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DHGvQZh4As45l4QTyhPJL411rJYo%253D)