[Selenium] 블로그 URL 자동으로 번역하는 프로그램 예제 소스

Selenium.Webdriver.Chromedriver는 단순하고 또 간결하게 웹을 탐색할 수 있도록 제공하는 프로그램입니다. selenium은 셀레늄 또는 셀레니움이라고 읽습니다~

Selenium을 통해 블로그 URL을 자동으로 변역하는 프로그램을 만들어 봅시다. 우선 URL을 영문으로 Encoding 적용하려는 이유(서치콘솔)는 다음과 같습니다.

selenium 프로그램으로 블로그 URL을 자동으로 번역해 봅시다.

티스토리 URL을 별로 신경 안 쓰시는 분도 있을 테고, 초기 설정인 자동순번제를 그대로 발행하시는 분도 있을 것입니다. 저는 설정이 순번 말고 URL을 입력이 가능하도록 하였으며, 블로그 초기에는 제목 그대로 발행하도록 그냥 두었습니다.

구글 서치콘솔 URL

그런데 서치콘솔을 점검하다 보니 한글 같은 경우 헥스로 인코딩 되어 URL이 너무 길어지는 현상을 발견했습니다. 물론 헥스로 변했다고 하여 검색에 문제가 있지는 않을 것이나, 저게 어떤 글인지 단번에 파악하기 힘든 부분 때문에 URL을 영문으로 설정하기로 하였습니다.

첫 시도 : 구글 번역 API 사용하기

구글 트랜슬레이션 가격 정책

거의 완성해서 Google Cloud Translation API를 적용하려니... 유료네요...?
어차피 제목 변환 용도로 간단하게 쓸 거라 구매를 할 생각이 없어서 다른 방법을 생각해 보겠습니다.
처음부터 가격 정책을 봤어야 했는데...😂😂😂

두 번째 시도 : Selenium을 이용한 구글 번역기 활용하기

셀레늄(셀레니움)

셀레늄(셀레니움)은 간단한 크롤러를 만들 때 유용한 패키지예요.
셀레늄을 활용하여 아래와 같은 흐름으로 간단한 번역 프로그램을 만들어 봅시다.
프로그램 흐름은 다음과 같습니다.

  1. 번역 대상 문자를 작성하기
  2. 구글 번역기 홈페이지로 URL 이동하기
  3. 번역을 하려는 글자를 탐색
  4. 번역이 된 문장을 가져오기
  5. 가공하여 URL 만들기

번역 대상 탐색하기

무엇을 번역할지 작성하기

"(부산지방)병무청은 어디에 있을까요...? 수영구에,, 있지요~!!!!!" 문자를 번역해 보겠습니다.

번역 사이트 이동 > 번역하기 > 번역된 문장 가져오기

셀레늄 크롬 드라이버

셀레늄 패키지 + 크롬 드라이버를 오픈소스를 활용합니다.
구글 번역 홈페이지로 이동한 다음에, 번역 대상에 글자를 넣고 해석된 문자를 가져오도록 합시다.

URL 형식에 맞게 입맛에 맞도록 가공하기

구글 번역하기

번역 결과 원문을 토대로 공란 및 특수문자 일부는 '-'로 대체하도록 진행합니다.
(URL encoding 관련으로 보완합니다.)

번역기 예시 소스 안내

private void Sel()
{
    //(부산지방)병무청은 어디에 있을까요...? 수영구에,, 있지요~!!!!!
    txtTrans.Text = string.Empty;
    txtTransSrc.Text = string.Empty;

    const int tryCnt = 30;
    int cnt = 0;
    string srcP = "//textarea[@class='er8xn']";
    string tarP = "//span[@class='Q4iAWc']";
    string transUrl = "https://translate.google.com/?sl=ko&tl=en&op=translate&hl=ko";
    double fWaitMs = 100;
    double sWaitMs = 100;

    //IWebDriver driver = new ChromeDriver();
    using (IWebDriver driver = new ChromeDriver())
    {
        driver.Navigate().GoToUrl(transUrl);

        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(fWaitMs);

        driver.FindElements(By.XPath(srcP)).FirstOrDefault().SendKeys(txtS.Text);

        while (driver.FindElements(By.XPath(tarP)).Count <= 0)
        {
            cnt++;
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(sWaitMs);

            if (cnt >= tryCnt)
            {
                driver.Quit();
                txtTrans.Text = $"{TimeSpan.FromMilliseconds(sWaitMs * cnt)} 시간 경과로 인한 종료 / 간격 {sWaitMs}ms, 시도횟수 {cnt}";
                return;
            }
        }

        IEnumerable<IWebElement> tars = driver.FindElements(By.XPath(tarP));
        string tra = string.Empty;
        foreach (var tar in tars)
        {
            if (tra == string.Empty)
                tra += tar.Text;
            else
                tra += "-" + tar.Text;
        }

        driver.Quit();

        txtTransSrc.Text = tra;
        txtTrans.Text = GetUrl(tra);
    }
}

셀레늄 오픈소스를 이용합니다. NuGet 패키지에서 셀레늄을 설치해 주세요.

구글 번역 사이트 탐색

구글 번역기 사이트로 탐색합니다.
driver.Navigate().GoToUrl(transUrl);

명시적 대기

탐색한 다음에 문서의 로딩이 끝날 때까지 100밀리세컨드를 기다리겠습니다.
driver.Manage().Timeouts().ImplicitWait
=> Explicit wait(WebDriverWait을 선언하여 명시적으로 대기), Implicit wait, FluentWait(특정 조건으로 최대 대기시간을 명시하며 대기) 이 있는데 저는 Implicit로 대기하였습니다.

번역하려는 글 보내기

번역 대상 문자 입력하기
driver.FindElements(By.XPath(srcP)).FirstOrDefault().SendKeys(txtS.Text);
=> 요소 중에 해당 XPath와 일치하는 것을 찾아 번역 대상 문자를 입력합니다.

XPath

셀레늄 문법

XPath은 XML Path Language의 약자입니다.
XPath 구문에서 예시 소스에서 사용한 //textarea[@class='er8xn'] 은 textarea 엘리먼트 중 class가 er8xn인 것을 찾습니다.

번역된 문장 가져오기

한글에서 영어로 번역이 된 문장을 가져오기
해석문장이 나오는 엘리먼트의 값이 나올 때까지 100밀리세컨드를 총 30회(3초)까지 기다리도록 하였습니다. (3초 넘어가면 탐색을 중단합니다)

문장 조정

해석 문장을 조정하는 단계입니다. 값을 번역 결과 원문 부분과 가공 부분에 각각 등록합니다. 가공 문장은 url 서식에 맞추어 정규표현식으로 진행하였습니다.

댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗