[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
여기 있는 기본 기능들만 이용하였다.
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