[playwright][nodejs] 세상 쉽게 파파고(papago) 번역 자동화 만들기
[playwright][nodejs] 세상 쉽게 파파고(papago) 번역 자동화 만들기
서론
이번에는 약간 특별한 프로젝트를 시작해 보려고 합니다. "세상 쉽게 파파고(Papago) 번역 자동화 만들기"라는 주제로 이야기를 풀어 나갈 예정입니다. 이 주제를 선택한 이유는, 기존에는 주로 Python 언어를 이용한 자동화 스크립트가 많이 보이는데, 저는 이번에는 다른 접근 방식을 시도해 보고자 했기 때문입니다. 바로 Node.js와 Playwright를 이용해서 번역 작업을 자동화하는 것입니다.
Playwright는 웹 애플리케이션을 위한 엔드 투 엔드 테스팅을 가능하게 하는 Node.js 라이브러리입니다. 특히 최신 웹 브라우저를 지원하고, 싱글 API를 통해 여러 브라우저를 테스트할 수 있다는 점에서 많은 개발자들에게 사랑받고 있습니다. 그리고 이번 프로젝트에서는 이 Playwright를 이용해서 웹 번역 도구인 '파파고'를 자동으로 조작하는 방법을 소개하려고 합니다.
하지만 이번 프로젝트의 본격적인 시작에 앞서, 몇 가지 주의해야 할 사항이 있습니다. 이 포스트는 교육적 목적으로 작성되었으며, 실제로 파파고 서비스를 자동화하는 행동은 네이버의 서비스 이용 약관에 위배될 수 있습니다. 따라서 이 포스트에서 소개하는 방법은 테스트 환경에서만 사용하고, 실제 서비스에 적용하지 않도록 주의해야 합니다.
그럼에도 불구하고 이 주제를 다루는 이유는, 프로그래밍에서 자동화의 중요성과 Playwright를 이용한 웹 조작 기술에 대해 알려주기 위해서입니다. 물론, Playwright의 활용법은 이번 파파고 번역 자동화뿐만 아니라 다양한 웹 자동화 작업에 활용될 수 있습니다.
Node.js와 Playwright를 이용한 자동화에 대한 접근법이 Python과 어떻게 다른지, 이 두 가지 도구를 이용하여 어떻게 웹 애플리케이션을 조작할 수 있는지에 대한 자세한 내용을 아래에서 다루도록 하겠습니다. 이 포스트가 여러분의 웹 자동화 작업에 도움이 되길 바라며, 간단한 프로젝트를 통해 더 많은 경험을 쌓는 계기가 되었으면 좋겠습니다.
그전에 이전에 작성된 포스트를 한번 훓어 보는것을 추천 드립니다.
그럼 이제 본격적으로 Node.js와 Playwright를 이용한 '세상 쉽게 파파고 번역 자동화 만들기'를 시작해봅시다!
코드 설명
이전에 작성한 포스팅이랑 겹치는 부분도 많을것 같아서 딱 필요 한 부분만 코드로 설명 하고자한다. 아래의 코드는 다음과 같은 순서를 가지고 있다.
- 실패시 Retries 처리
- Random Agent를 가져온다.
- Browser 셋팅을 한다.
- Page 셋팅을 한다.
- 파파고 페이지 접속
- 번역 텍스트 입력
- 번역하기
- 번역된 텍스트 가져오기
const papago = async (text) => {
let result = null;
let retries = 3; //네트워크 상황이나 기타 이슈로 실패될 경우 몇번 시도 할지 지정
const userAgent = ''; //동일한 Agent보다는 여러개의 Agent를 돌려가면서 사용 하는게 좋다.
while (true) { //Retries 때문에 while....
let browser = null;
try {
browser = await chromium.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox'], //서버 실행시 필요함, 로컬 테스트시에는 특별히 문제 없음
headless: true, //서버에서 실행시 false 혹은 삭제
});
await browser.newContext({ userAgent: userAgent}); // Agent 등록
const page = await context.newPage(); //새 page 오픈
//페이지 진입시 불필요한 리소스 로드 하지 않기 위한 작업
await page.setRequestInterception(true);
page.on('request', (req) => {
switch (req.resourceType()) {
case 'font':
case 'image':
req.abort();
break;
default:
req.continue();
break;
}
});
//파파고 번역 페이지 접속
await page.goto(`https://papago.naver.com/?sk=en&tk=ko`);
await page.evaluate('document.getElementById("txtSource").value = `' + text + '`');
await page.type('#txtSource', String.fromCharCode(13));
//번역하기 버튼 클릭
await page.click('#btnTranslate');
await page.evaluate('document.getElementById("txtTarget").innerHTML');
await page.evaluate('document.getElementById("txtTarget").innerText != "..."');
const translatedText = await page.evaluate(`document.getElementById("txtTarget").innerText`);
result = translatedText || text;
} catch (e) {
console.log(e)
} finally {
await browser.close();
if (!_.isEmpty(result) || retries === 0) {
break;
}
retries--;
//실패시 제작 대기
await new Promise(function (resolve) {
setTimeout(resolve, 10000)
});
}
}
return result;
}
작성 하다가 .. 시간 부족해서 .. 이만 마무리 합니다. 혹시나 동작 안하거나 궁금 하신 부분이 있다면 댓글로 알려주시면 추가 내용 알려 드릴께요...
댓글