• [Crawling] 스타벅스 매장 위치 데이터 크롤링하기
    프로그래밍/Python 2023. 1. 26. 17:12
    728x90

    Python으로 크롤링 하는 법

    파이썬으로 크롤링하는 방법은 크게 selenium을 쓰는 방법과 requests를 사용해서 하는 방법으로 나뉜다.

    평상시에 윈도우가 아닌 환경에서 Jupyter를 사용하고 requests를 사용하여 크롤링하는 것이 속도 측면에서 더 나아서 크롤링할 때는 requests를 사용한다.

     

    검색해보면 BeautifulSoup와 selenium을 사용하여 크롤링하는 방법 위주로 설명된 블로그들이 많아, requests를 이용해서 스타벅스의 매장 위치를 크롤링 하는 방법을 소개하고자 한다.

     

    소스 코드

    import math
    import random
    import requests
    import pandas as pd

     

    스타벅스 홈페이지에서 매장을 불러오는 구조를 보면 randomString을 요구하고 있으므로 js로 구현된 해당 함수를 python으로 재작성하였다.

    def randomString():
        chars = "0123456789ABCDEFGHIKLMNOPQRSTUVWXYZ";
        string_length = 10;
        randomstring = '';
        for i in range(0, string_length):
            rnum = int(math.floor(random.random() * len(chars)));
            randomstring += chars[rnum : rnum+1];
        
        return randomstring

     

    이후 매장 정보를 불러오는 함수에서는 시군구 리스트를 요구하는데, requests.post를 이용하여 추출하였다.

    def getGugunList():
        url = 'https://www.starbucks.co.kr/store/getGugunList.do'
        gugunlist = [[]]
        for i in range(1, 18): #17개의 시군구를 담음
            datas = {
                'sido_cd': str(i).zfill(2)
            }
            response = requests.post(url, data=datas).json()
    
            for j in range(0, len(response['list'])):
                gugunlist[i-1].append(response['list'][j])
    
            gugunlist.append([])
        return gugunlist

     

    매장을 불러오는 js함수를 python으로 재작성한 것이다.

    def getStore(p_gugun_cd, p_sido_cd):
        randomStr = randomString()
        url = 'https://www.starbucks.co.kr/store/getStore.do?r=' + randomStr
        datas = {
            'P10': 0,
            'P20': 0,
            'P30': 0,
            'P40': 0,
            'P50': 0,
            'P60': 0,
            'P70': 0,
            'P80': 0,
            'P90': 0,
            'T01': 0,
            'T03': 0,
            'T05': 0,
            'T09': 0,
            'T10': 0,
            'T12': 0,
            'T21': 0,
            'T22': 0,
            'T27': 0,
            'T30': 0,
            'T36': 0,
            'T43': 0,
            'T48': 0,
            'all_store': 0,
            'iend': "100",
            'in_biz_cd': "",
            'in_biz_cds': 0,
            'in_distance': 0,
            'in_scodes': 0,
            'ins_lat': 37.0,
            'ins_lng': 126.0,
            'isError': True,
            'new_bool': 0,
            'p_gugun_cd': p_gugun_cd,
            'p_sido_cd': p_sido_cd,
            'rndCod': randomStr,
            'searchType': "C",
            'search_text': "",
            'set_date': "",
            'whcroad_yn': 0  
        }
        response = requests.post(url, data=datas).json()
        return response;

     

    사용자 정의 함수로 모두 만들어두었으니 절차에 맞게 호출하여 List에 담으면 된다.

    Gugun = getGugunList()
    
    result = []
    
    for i in range(0, len(Gugun)):
        for j in range(0, len(Gugun[i])):
            Store = getStore(Gugun[i][j]['gugun_cd'], Gugun[i][j]['gugun_cd'][0:2])
            Store = Store['list']
            for k in range(0, len(Store)):
                savedata = {
                    'sido_name': Store[k]['sido_name'],
                    'gugun_name': Store[k]['gugun_name'],
                    'addr': Store[k]['addr'],
                    's_name': Store[k]['s_name'],
                    'lat': Store[k]['lat'],
                    'lot': Store[k]['lot']
                }
                result.append(savedata)

     

    이후 보기 좋게 result list에 담긴 데이터를 아래와 같이 DataFrame으로 만들어서 볼 수 있다.

    selectdata = pd.DataFrame(result)
    
    selectdata

     


    728x90

    댓글

Copyright ⓒ syudal.tistory.com