Puppeteer는 Node.js를 위한 노드 라이브러리이며, headless Chrome 또는 Chromium을 제어하기 위한 고급 API를 제공한다. 이를 통해 웹 브라우저를 자동화하고, 스크린샷을 찍거나 페이지 내용을 수집하며, 사용자 인터랙션을 시뮬레이션할 수 있다.
Puppeteer
는 Chrome 또는 Chromium을 headless 모드(화면 표시 없이 백그라운드에서 실행)로 실행하여 브라우저를 제어한다.먼저 NestJS 프로젝트를 생성한다.
npx @nestjs/cli new nest-puppeteer
Puppeteer 라이브러리를 설치한다.
npm install puppeteer
Puppeteer와의 상호작용을 위한 서비스를 생성한다.
nest generate service puppeteer
puppeteer.service.ts
파일을 열고 Puppeteer 관련 코드를 작성한다.
import { Injectable } from '@nestjs/common';
import * as puppeteer from 'puppeteer';
@Injectable()
export class PuppeteerService {
async getScreenshot(url: string): Promise<Buffer> {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url);
const screenshot = await page.screenshot();
await browser.close();
return screenshot;
}
}
Puppeteer 서비스를 사용할 컨트롤러를 생성한다.
nest generate controller puppeteer
puppeteer.controller.ts
파일을 열고 컨트롤러를 작성합니다.
import { Controller, Get, Query, Res } from '@nestjs/common';
import { PuppeteerService } from './puppeteer.service';
import { Response } from 'express';
@Controller('puppeteer')
export class PuppeteerController {
constructor(private readonly puppeteerService: PuppeteerService) {}
@Get('screenshot')
async getScreenshot(@Query('url') url: string, @Res() res: Response) {
const screenshot = await this.puppeteerService.getScreenshot(url);
res.setHeader('Content-Type', 'image/png');
res.send(screenshot);
}
}
app.module.ts
파일을 열고 Puppeteer 모듈을 가져온다.
import { Module } from '@nestjs/common';
import { PuppeteerService } from './puppeteer/puppeteer.service';
import { PuppeteerController } from './puppeteer/puppeteer.controller';
@Module({
imports: [],
controllers: [PuppeteerController],
providers: [PuppeteerService],
})
export class AppModule {}
NestJS 애플리케이션을 실행한다.
npm run start
브라우저에서 http://localhost:3000/puppeteer/screenshot?url=https://example.com을 방문하여 스크린샷을 확인한다.
이 예제는 NestJS와 Puppeteer를 통합하여 웹 페이지의 스크린샷을 찍는 간단한 방법을 보여준다. 이 구조를 기반으로 더 복잡한 브라우저 자동화 작업을 수행할 수 있다.