안녕하세요.
요즘 많은 분들이 파이썬을 통하여 크롤링을 하고 있습니다.
크롤링 공부를 할 때 관심있었던 분야나 기사 서비스 등을 크롤링 하면 더 재밌게! 공부 할 수 있을 것 같아서
하루에 하나씩 크롤링 , 1일 1크롤링을 해보고 있습니다.
크롤링 했던 내용 중 재밌었던 내용들을 모아 소개하려고 합니다.
먼저, 크롤링이란?
크롤링 혹은 스크래핑이라고도 하며 웹 페이지를 가져와서 원하는 데이터를 추출해 내는 행위입니다.
혹시? 페이스북 창업 스토리인 소셜 네트워크를 시청하셨나요?
영화 속에서 주커버그가 여학생들의 사진을 인터넷에 모으는 장면이 나오는데 이것이 바로 크롤링입니다.
python은 크롤링 분야의 선도주자로(출처: 나무위키) requests와 beautifulsoup 라는 라이브러리를 이용해서 쉽게 크롤링 할 수 있습니다.
1. 네이버 파파고 크롤링하기
네이버에는 파파고라는 번역기가 있습니다. 플리토 서비스와 시장 경쟁을 하고 있는 서비스죠.
그럼 한 번 네이버 파파고 번역기 크롤링을 시작해 보도록 하겠습니다...!
-> 파파고 서비스를 크롤링하여 상업적으로 이용해서는 안됩니다.
-> 최근에 API가 공개되어 정식으로 이용하기 위해서는 api 를 이용하시면 됩니다.
시작에 앞서..!
requests와 beautifulsoup의 기본적인 이용을 알고 싶은 분은 beomi's Tech blog 의 내용을 보고 오시는 것을 추천드립니다.
링크: https://beomi.github.io/2017/01/20/HowToMakeWebCrawler-With-Login/
1. 먼저 분석이 필요한 PAPAGO 사이트를 크롬으로 열고 개발자 도구를 열어주세요.
크롬의 개발자 도구! 를 이용해서
어떤 요청이 전송될 때 우리가 원하는 데이터인 < 번역된 내용 > 이 response 되는지 확인해 합니다.
제가 번역하기 부분을 클릭했을 때 어떤 요청들이 일어났는지 확인할 수 있고, 그에 대한 response를 확인할 수 있습니다.
개발자 도구에서 NETWORK 부분을 확인해 보겠습니다.
NETWORK 부분에서는 많은 요청들이 있습니다. 사진을 요청하는 것들도 있고 기타 여러가지 요청들이 있겠죠!
저는 그 중에서 translate 라는 이름을 가진 요청을 확인해보았고, 응답을 보니 저희가 원하는 결과를 응답해주었네요!!!
그렇다면 requests 라이브러리로 translate라는 주소를 가진 주소로 요청을 하면 같은 응답을 받을 수 있습니다.
* key 포인트 !
왜 저는 function으로 구현하지 않고 class의 call 속성을 이용해서 설계했을까요?
-> 그 이유는 '상속'을 이용하기 위해서입니다.
한국어-영어, 영어-한국어, 한국어- 중국어 이렇게 3가지 번역기를 만들 때
코드가 중복되기 때문에 클래스의 멤버함수인 __call__ 함수를 이용해서 구현했습니다.
class Papago_En_ko(Papago_Ko_en):
def data_setting(self):
self.data = {'source': 'en',
'target': 'ko',
'text': ''}
class Papago_Ko_ch(Papago_Ko_en):
def data_setting(self):
self.data = {'source': 'ko',
'target': 'zh-CN',
'text': ''}상속을 통해서 En -> ko 번역기와 KO -> CH 번역기를 코드의 중복을 피해서 설계할 수 있었습니다!
import requests as req import re import json
class Papago_Ko_en():
def info_setting(self):
self.url = 'http://labspace.naver.com/api/n2mt/translate'
self.request_headers = {
'User-Agent': (
자신의 유저 agent'),
'Referer': 'http://labspace.naver.com/nmt/',
'x-naver-client-id': 'labspace'
}
def data_setting(self):
self.data = {'source': 'ko',
'target': 'en',
'text': ''}
def __call__(self):
self.info_setting()
self.data_setting()
print('번역하기 원하는 내용을 적어주세요!')
q=input()
self.data['text']=q
html = req.post(url=self.url, data=self.data, headers=self.request_headers).text
response = json.loads(html)
dict = response['message']['result']['translatedText']
print('파파고 변역 전:',q)
print('파파고 번역 결과:',dict)
class Papago_En_ko(Papago_Ko_en):
def data_setting(self):
self.data = {'source': 'en',
'target': 'ko',
'text': ''}
class Papago_Ko_ch(Papago_Ko_en):
def data_setting(self):
self.data = {'source': 'ko',
'target': 'zh-CN',
'text': ''}
if __name__=='__main__':
print('원하는 번역의 번호를 선택하고 번호를 입력해주세요.')
print('한글 -> 영어:1')
print('영어 -> 한글:2')
print('한글 -> 중국어:3')
opt=input()
if opt=='1':
korea_papago = Papago_Ko_en()
korea_papago()
elif opt == '2':
english_papago = Papago_En_ko()
english_papago()
elif opt == '3':
china_papago = Papago_Ko_ch()
china_papago()
else:
print('번호를 잘 못 누르셨습니다 1~3 을 선택해주세요!')
exit()
터미널보다 보기 쉬운 UI를 위해서 주피터 노트북을 이용하였습니다!
3가지 번역 모두 잘 구현되는걸 확인할 수 있습니다.
관련해서 궁금한 내용이 있으시면 댓글 달아주시면 답변 드리겠습니다 !