[스파르타코딩클럽] 개발일지 #4.2- 번역기 연동 (Kakao i, Google T, Papago - Requests & Selenium)

lee_dy·2020년 9월 1일
0
post-thumbnail

1. 개발 목표

Open 번역 API의 글자 제한으로 인해 개발 방향을 수정하였다.
이번 포스팅에서는 각종 파이썬 웹스크래핑 방식으로 번역 데이터를 가져와 보겠다.

2. 개발 과정

- Requests로 번역 데이터 가져오기

Requests?
Requests는 python에서 웹 서버와 정해진 규약(HTTP)에 따라 데이터를 요청하고 전달 받은 데이터를 관리하는 모듈이다. Requests 모듈을 사용하면 프로토콜의 존재를 모르고 정해진 함수만 호출하면 원하는 데이터를 얻을 수 있다. 웹 서버에게 데이터를 요청하는 방법 및 서버에게 전달한 값을 처리하는 방법이 웹페이지마다 모두 다를 수 있기에 세부 내용을 사용자가 모두 컨트롤해야한다는 단점이 있지만, 불필요한 데이터를 요청하지 않기 때문에 빠른 속도로 스크래핑을 할 수 있다는 장점이 있다.
(출처: 파이썬으로 배우는 웹스크래핑 | https://wikidocs.net/book/4614)

요약하자면 Requests 모듈의 가장 큰 장점은 빠른 속도로 데이터를 스크래핑할 수 있다는 것이다. 다만, 복잡한 제어 구조로 인해 나같은 초보 개발자가 다루기에는 조금 어려웠다.

따라서 참고자료가 존재하는 Kakao i 번역만 requests 방식으로 데이터를 가져오는데 성공하였다.
(Papago와 Google T도 동일한 방식으로 시도해보았지만 실패하였다 .. ㅜㅜ)

  • Kakao i
    (참고자료: 파이썬으로 배우는 웹스크래핑 | 카카오 번역 스크래핑 | https://wikidocs.net/82621)
    import requests
    url = "https://translate.kakao.com/translator/translate.json"
    headers = {
        "Referer": "https://translate.kakao.com/",
        "User-Agent": "Mozilla/5.0"
    }
    data = {
        "queryLanguage": "kr",
        "resultLanguage": "en",
        "q": "안녕하세요"
    }
    resp = requests.post(url, headers=headers, data=data)  
    data = resp.json()
    output = data['result']['output'][0][0]
    print(output)

- Selenium으로 번역 데이터 가져오기

Selenium?
셀레니움은 웹을 테스트하는데 사용하는 프레임워크로 Selenium IDE, Selenium Webdriver, Selenium Grid로 구성된다. 이 중 Webdriver을 사용하면 파이썬으로 웹 브라우져 제어가 가능해져, 가져올 데이터가 존재하는 웹페이지로 이동해 필요한 데이터를 가져올 수 있다. 셀레니움을 웹스크래핑 용도로 사용하면 브라우져에 출력되는 결과를 즉시 확인할 수 있어서 스크래핑과 디버깅이 쉽다는 장점이 있지만, 동적 페이지까지 모두 렌더링하는데 많은 시간이 소요된다는 치명적인 단점이 있다.
(출처: 파이썬으로 배우는 웹스크래핑 | https://wikidocs.net/book/4614)

Requests로 스크래핑에 실패한 두 번역기는 Selenium을 통해 데이터를 가져왔다. Selenium은 조작 방법이 굉장히 직관적이기 때문에 스크래핑하는 데 있어서 사이트의 제약을 크게 받지 않았다.

  • Papago
    (참고자료: https://book.coalastudy.com/data_crawling/week6/challenge1/answer)
    from selenium import webdriver
    import time
    driver = webdriver.Chrome("./chromedriver")
    driver.get("https://papago.naver.com")
    time.sleep(0.5)
    input_box = driver.find_element_by_css_selector("textarea#txtSource")
    input_box.send_keys("seize the day")
    button = driver.find_element_by_css_selector("button#btnTranslate")
    button.click()
    time.sleep(0.5)
    result = driver.find_element_by_css_selector("div#txtTarget").text
    print(result)
    driver.close()
  • Google Translate
    Papago의 코드에서 사이트 url, 셀렉터 이름, 버튼 제어문만 수정하였다.
    (구글 번역기의 경우 버튼이 따로 존재하지 않고, 텍스트가 입력되면 자동으로 번역이 되는 구조)
    from selenium import webdriver
    import time
    driver = webdriver.Chrome("./chromedriver")
    driver.get("https://translate.google.com/#view=home&op=translate&sl=auto&tl=ko")
    time.sleep(0.5)
    input_box = driver.find_element_by_css_selector(""#source")
    input_box.send_keys("seize the day")
    time.sleep(1)
    result = driver.find_element_by_css_selector("div.text-wrap.tlid-copy-target").text
    print(result)
    driver.close()

단점이 있다면, Selenium의 경우 Requests와 달리 번역기의 언어를 변경할 때, 특정 변수가 아닌 버튼 혹은 url을 통해 제어해야만 했다. 나의 경우 이탈리아어를 한글과 영어 두 가지로 번역하고 싶었기 때문에 언어 변경이 필요했고, 이를 위해 각각의 번역 페이지 url(IT>KO, IT>ENG)을 리스트에 넣은 후 반복문으로 처리해 코드를 구현하였다.

3. To do ...

파이썬 웹 스크래핑 모듈을 통해 번역 데이터를 가져오는 방법을 터득했으니 이제 남은 것은 BE와 FE를 구축하여 실제 웹사이트에 적용하는 것이다. 다음 포스팅에는 이 두가지를 구현하는 과정을 작성하도록 하겠다.

  • BE /translate API 적용
  • FE 구축

0개의 댓글