Open 번역 API의 글자 제한으로 인해 개발 방향을 수정하였다.
이번 포스팅에서는 각종 파이썬 웹스크래핑 방식으로 번역 데이터를 가져와 보겠다.
Requests?
Requests는 python에서 웹 서버와 정해진 규약(HTTP)에 따라 데이터를 요청하고 전달 받은 데이터를 관리하는 모듈이다. Requests 모듈을 사용하면 프로토콜의 존재를 모르고 정해진 함수만 호출하면 원하는 데이터를 얻을 수 있다. 웹 서버에게 데이터를 요청하는 방법 및 서버에게 전달한 값을 처리하는 방법이 웹페이지마다 모두 다를 수 있기에 세부 내용을 사용자가 모두 컨트롤해야한다는 단점이 있지만, 불필요한 데이터를 요청하지 않기 때문에 빠른 속도로 스크래핑을 할 수 있다는 장점이 있다.
(출처: 파이썬으로 배우는 웹스크래핑 | https://wikidocs.net/book/4614)
요약하자면 Requests 모듈의 가장 큰 장점은 빠른 속도로 데이터를 스크래핑할 수 있다는 것이다. 다만, 복잡한 제어 구조로 인해 나같은 초보 개발자가 다루기에는 조금 어려웠다.
따라서 참고자료가 존재하는 Kakao i 번역만 requests 방식으로 데이터를 가져오는데 성공하였다.
(Papago와 Google T도 동일한 방식으로 시도해보았지만 실패하였다 .. ㅜㅜ)
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 IDE, Selenium Webdriver, Selenium Grid로 구성된다. 이 중 Webdriver을 사용하면 파이썬으로 웹 브라우져 제어가 가능해져, 가져올 데이터가 존재하는 웹페이지로 이동해 필요한 데이터를 가져올 수 있다. 셀레니움을 웹스크래핑 용도로 사용하면 브라우져에 출력되는 결과를 즉시 확인할 수 있어서 스크래핑과 디버깅이 쉽다는 장점이 있지만, 동적 페이지까지 모두 렌더링하는데 많은 시간이 소요된다는 치명적인 단점이 있다.
(출처: 파이썬으로 배우는 웹스크래핑 | https://wikidocs.net/book/4614)
Requests로 스크래핑에 실패한 두 번역기는 Selenium을 통해 데이터를 가져왔다. Selenium은 조작 방법이 굉장히 직관적이기 때문에 스크래핑하는 데 있어서 사이트의 제약을 크게 받지 않았다.
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()
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)을 리스트에 넣은 후 반복문으로 처리해 코드를 구현하였다.
파이썬 웹 스크래핑 모듈을 통해 번역 데이터를 가져오는 방법을 터득했으니 이제 남은 것은 BE와 FE를 구축하여 실제 웹사이트에 적용하는 것이다. 다음 포스팅에는 이 두가지를 구현하는 과정을 작성하도록 하겠다.