본격적인 분석 및 시각화에 앞서,

웹크롤링을 해서 필요한 데이터를 모아보겠다.

 

참고로 여기서는 구글Colab이라는

노트북을 통해 프로젝트를 진행한다.

 

그리고 누군가를 가르치기 위한 글이 아니기에

설명이 부족할 수 있다.

궁금한 내용은

쪽지나 댓글로 물어보길 바란다.

 

먼저, 전체적으로 필요한 모듈을 import 하겠다.

colab에서만 사용되는 코드도 포함되어 있으니

간단하게만 살펴보겠다.

 

#필요한 모듈 불러오기
import time #시간모듈
from itertools import count #수 관련 모듈


#웹크롤링 및 데이터 정리를 위한 준비
import urllib.request #웹에 접근하기 위한 모듈
import json #json 데이터 사용을 위한 모듈
from bs4 import BeautifulSoup as bs #웹크롤링을 위한 모듈
import pandas as pd #데이터 분석을 위한 모듈
import numpy as np #과학 계산을 위한 모듈
import scipy.stats #과학기술계산을 위한 모듈

!apt install chromium-chromedriver #웹드라이버 설치
!pip install selenium #셀레니움 설치
from selenium import webdriver #웹 테스트 자동화 도구, 웹 크롤링을 위한 모듈
#driver.implicitly_wait(3) 웹 로딩 기다려주는 시간

#url구문을 분석하기 위한 도구
import urllib.parse

#R사용을 위한 모듈
import rpy2.robjects as ro

#시각화를 위한 matplotlib
import matplotlib as mpl
import matplotlib.pyplot as plt

#마이너스 표시하기
mpl.rcParams['axes.unicode_minus'] = False 

#그래프 해상도 높이기
%config InlineBackend.figure_format = 'retina'

#matplotlib에 한글 폰트 적용
!apt -qq -y install fonts-nanum
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9) #한글폰트 기본으로 설정
plt.rcParams["font.family"] = 'NanumBarunGothic'
plt.rc('font', size="40") #전체 폰트와 크기 설정
plt.rcParams['figure.figsize'] = (14,4) #차트 기본 크기 설정
mpl.font_manager._rebuild() #폰트설정 리빌드

대충 필요할 것으로 예상되는

모든 모듈을 다 불러왔다.

추가적으로 필요한 것은 나중에 필요할때마다

불러오겠다.

다음으로 맥도날드부터 크롤링을 해보겠다.

맥도날드를 '지점명/주소(도)/주소(시)'의 형태로

데이터를 만들어주었다.

 

#HTTP요청 기능을 받아오는 모듈
req = urllib.request
#지역명 통일시켜주기 위한 딕셔너리
regionDic = {
    '서울':'서울특별시', '인천':'인천광역시', '대전':'대전광역시', '대구':'대구광역시',
    '부산':'부산광역시', '광주':'광주광역시', '울산':'울산광역시', '세종':'세종특별자치시'
    ,'경기':'경기도', '강원':'강원도', '충북':'충청북도', '충남':'충청남도', '경북':'경상북도',
    '경북':'경상북도', '경남':'경상남도', '전북':'전라북도', '전남':'전라남도', '제주':'제주특별자치도'
    }

 

먼저 http를 요청해서 웹의 소스를 읽을 준비와

지역명을 통일 시켜주기 위한 딕셔너리를 만들었다.

 

#첫페이지 설정
def mcd_search_one_page(PGNUM):
    #지점명과 주소를 저장할 배열
    RETURN_ARR = []
    #맥도날드 URL 설정 / 파일이름과 쿼리사이는 ?로 구분함
    MCDONALDS_URL = 'https://www.mcdonalds.co.kr/kor/store/list.do?page={}'.format(PGNUM)
    #웹 서버에 정보를 요청 후 
    response = req.urlopen(MCDONALDS_URL)
    #요청한 데이터 반환 / 텍스트 반환
    MCD_HTML = response.read().decode('utf-8')
    #받은 웹 소스를 BeautifulSoup으로 부르기
    soup = bs(MCD_HTML)
    #매장명을 모으기 / findAll은 특정 태그들을 배열 안에 넣어서 출력함
    for tag in soup.findAll('dl', attrs={'class': 'name'}):
        #contents는 bs4로 가져온 데이터의 내용을 표현하게 하는 메소드
        storeName = tag.findAll('a', attrs={'title': '지도보기'})[0].contents[-1]
        storeAddress = tag.findAll('dd', attrs={'class': 'road'})[0].contents[-1]
        #경기 부천의 형태로 출력하기 위해 주소를 앞에서 두 단어만 가져옴
        storeAddress = storeAddress.split()[:2]
        RETURN_ARR.append([storeName+"점"] + storeAddress)
    #지역이름이 딕셔너리에 있으면 바꾸고 없으면 넘어감
        for i in range(len(RETURN_ARR)):
            if regionDic.get(RETURN_ARR[i][1]) == None:
                pass
            else:
                RETURN_ARR[i][1] = regionDic.get(RETURN_ARR[i][1])
    return pd.DataFrame(RETURN_ARR, columns=('store', 'addr1', 'addr2')) if RETURN_ARR else None

맥도날드의  한 페이지에서

주소 정보를 가져와서 DataFrame을 만드는 코드이다.

def mcd_search_all_page():
    #최종 배열
    FINAL_RETURN = []
    #다음페이지로 이동해서 값 저장하기
    for page in count():
        one_page_data = mcd_search_one_page(page+1)
        print("{} 페이지 진행 중".format(page+1) )
        if one_page_data is None:
            break
        FINAL_RETURN.append(one_page_data)
        time.sleep(5)
    
    return pd.concat(FINAL_RETURN)

맥도날드의 모든 페이지에서 주소 정보를 받아오는 코드이다.

맥도날드 홈페이지의 페이지 쿼리를 변경하여,

모든 페이지에 있는 주소 정보를 받아온다.

mcd_table = mcd_search_all_page()
mcd_table

함수를 실행해보면, 다음과 같은 결과가 출력된다.

데이터가 원하는대로 잘 출력되었다.

중복되는 지점이 없는지 확인해보자.

#중복되는 지점명이 없는지 확인함
display(mcd_table['store'].duplicated())

무난하게 중복되는 지점명도 안나온다.

한번 지역별 맥도날드의 순위를 확인해보자.

M = mcd_table.apply(lambda x: x['addr1'] + ' ' + x['addr2'], axis=1).value_counts()
M.head()

보다시피 경남 창원이 12개로 1위,

서울 강남이 11개로 2위,

경기 수원, 용인, 고양 등의 도시가 10개로 공동 3위이다.

+ Recent posts