오늘은 간단하게 빅데이터로 맛집 검색을 도와주는 서비스인 


'다이닝 코드'를 크롤링 해보겠습니다.



검색어를 함수에 입력하면 


해당 검색어의 해당하는 1위 ~10위 까지의 식당이름과 url를 반환하는 함수를 코딩해보겠습니다.





http://www.diningcode.com/list.php?query=혼밥강남


먼저 url에서 query 부분을 params로 따로 분류해주겠습니다.


    params = {

        'query': q

    }

    # 응답 get 요청

    html = requests.get('http://www.diningcode.com/list.php?', params=params).text




먼저 beautifulsoup를 통해 보기 좋게 만들고 , 원하는 태그를 쉽게 찾을 수 있도록 만듭니다!


soup = BeautifulSoup(html, 'html.parser')


그리고 구글 개발자 도구를 이용해서 해당 태그를 찾습니다.



+ enumerate() 함수로 1부터 정수를 차례대로 만들 수 있습니다!


import requests as req

from bs4 import BeautifulSoup as bfs


def dining_code(q):

    params = {

        'query': q

    }

    # 응답 get 요청

    html = req.get('http://www.diningcode.com/list.php?', params=params).text


    soup = bfs(html, 'html.parser')

    rank_list = []


    # 1위 ~10위 식당이름하고, 링크

    for idx, tag in enumerate(soup.select('div.dc-restaurant-name a'), 1):

        rank_list.append('{}.{}'.format(idx, tag.text) + ' ' + 'http://www.diningcode.com/' + tag['href'])


    return rank_list




다음과 같은 결과를 얻을 수 있습니다.




다른 검색어에도 잘 적용되는 것을 확인할 수 있습니다.






감사합니다!


주의! 크롤링한 정보를 이익을 위해 사용하시면 안됩니다!




  1. 2018.08.06 16:54

    비밀댓글입니다

안녕하세요? world nomade 입니다.



요즘 많은 분들이 파이썬을 통하여 크롤링을 하고 있습니다.



크롤링 공부를 할 때 관심있었던 분야나 기사 서비스 등을 크롤링 하면 더 재밌게! 공부 할 수 있을 것 같아서


하루에 하나씩 크롤링 , 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가지 번역 모두 잘 구현되는걸 확인할 수 있습니다.


관련해서 궁금한 내용이 있으시면 댓글 달아주시면 답변 드리겠습니다 !

+ Recent posts