본문 바로가기

[playwright][nodejs] 세상 쉽게 파파고(papago) 번역 자동화 만들기

출입금지 발행일 : 2023-06-09

[playwright][nodejs] 세상 쉽게 파파고(papago) 번역 자동화 만들기

 

네이버 파파고(papago)

서론

이번에는 약간 특별한 프로젝트를 시작해 보려고 합니다. "세상 쉽게 파파고(Papago) 번역 자동화 만들기"라는 주제로 이야기를 풀어 나갈 예정입니다. 이 주제를 선택한 이유는, 기존에는 주로 Python 언어를 이용한 자동화 스크립트가 많이 보이는데, 저는 이번에는 다른 접근 방식을 시도해 보고자 했기 때문입니다. 바로 Node.js와 Playwright를 이용해서 번역 작업을 자동화하는 것입니다.

Playwright는 웹 애플리케이션을 위한 엔드 투 엔드 테스팅을 가능하게 하는 Node.js 라이브러리입니다. 특히 최신 웹 브라우저를 지원하고, 싱글 API를 통해 여러 브라우저를 테스트할 수 있다는 점에서 많은 개발자들에게 사랑받고 있습니다. 그리고 이번 프로젝트에서는 이 Playwright를 이용해서 웹 번역 도구인 '파파고'를 자동으로 조작하는 방법을 소개하려고 합니다.

하지만 이번 프로젝트의 본격적인 시작에 앞서, 몇 가지 주의해야 할 사항이 있습니다. 이 포스트는 교육적 목적으로 작성되었으며, 실제로 파파고 서비스를 자동화하는 행동은 네이버의 서비스 이용 약관에 위배될 수 있습니다. 따라서 이 포스트에서 소개하는 방법은 테스트 환경에서만 사용하고, 실제 서비스에 적용하지 않도록 주의해야 합니다.

그럼에도 불구하고 이 주제를 다루는 이유는, 프로그래밍에서 자동화의 중요성과 Playwright를 이용한 웹 조작 기술에 대해 알려주기 위해서입니다. 물론, Playwright의 활용법은 이번 파파고 번역 자동화뿐만 아니라 다양한 웹 자동화 작업에 활용될 수 있습니다.

Node.js와 Playwright를 이용한 자동화에 대한 접근법이 Python과 어떻게 다른지, 이 두 가지 도구를 이용하여 어떻게 웹 애플리케이션을 조작할 수 있는지에 대한 자세한 내용을 아래에서 다루도록 하겠습니다. 이 포스트가 여러분의 웹 자동화 작업에 도움이 되길 바라며, 간단한 프로젝트를 통해 더 많은 경험을 쌓는 계기가 되었으면 좋겠습니다.

 

그전에 이전에 작성된 포스트를 한번 훓어 보는것을 추천 드립니다.

2023.03.13 - [개발, 코딩해볼래?/자동화, Playwright, Puppeteer] - [자동화] playwright vs cypress vs puppeteer 라이브러리 비교 .feat 최강자는 누구?

 

[자동화] playwright vs cypress vs puppeteer 라이브러리 비교 .feat 최강자는 누구?

[자동화] playwright vs cypress vs puppeteer 라이브러리 비교 .feat 최강자는 누구? 1. 서론 Playwright, Cypress, Puppeteer는 모두 널리 사용되는 웹 애플리케이션 자동화 테스트 프레임워크입니다. 이러한 프레임

codehive.kr

2023.06.07 - [개발, 코딩해볼래?/자동화, Playwright, Puppeteer] - [nodejs][playwright] Playwright로 E2E(End to End, 종단) 테스트로 사용자의 입장에서 사용자가 사용하는 상황 테스트 작성하기

 

[nodejs][playwright] Playwright로 E2E(End to End, 종단) 테스트로 사용자의 입장에서 사용자가 사용하는 상

Playwright로 E2E(End to End, 종단) 테스트로 사용자의 입장에서 사용자가 사용하는 상황 테스트 작성하기 Playwright는 무엇인가? MS에서 개발한 Playwright는 하나의 API로 모든 최신 브라우저(크로미움, 파

codehive.kr

2023.03.12 - [개발, 코딩해볼래?/자동화, Playwright, Puppeteer] - [자동화][티스토리] node + playwright를 이용한 네이버 뉴스 크롤링 후 티스토리 매일 글 발행 하기!!



그럼 이제 본격적으로 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;
}

작성 하다가 .. 시간 부족해서 .. 이만 마무리 합니다. 혹시나 동작 안하거나 궁금 하신 부분이 있다면 댓글로 알려주시면 추가 내용 알려 드릴께요...

반응형

댓글