Backend

[DB 프로젝트 2] 데이터 수집 및 전처리

jini_11 2021. 11. 11. 01:59
728x90

1. 데이터 수집

 

펫존에 대한 정보 중 나는 음식점과 카페에 대한 데이터셋을 모으는 역할을 맡았다. 그래서 크롤러를 만들어 데이터셋을 수집하기로 하였고, 적당한 웹 사이트를 찾는 도중 'DININGCODE'라는 사이트를 발견했다.

 

반려견 동반이 가능한 음식점과 카페에 대한 모든 정보가 나와있어서 이 사이트에서 Selenium을 이용한 웹 크롤러를 구축해 데이터를 수집하기로 하였다.

 

++ 그리고 얻고자 하는 데이터셋의 목록은 (1) 아이디(primary key) (2) 가게 이름 (3) 종류(D001: 카페, D002: 음식점) (4) 주소 (5) 전화번호 (6) 오픈시간 (7) 마감시간 이다.

 

위 데이터 목록 중 웹 사이트를 통해 얻을 수 있는 목록은 (1) 가게 이름 (2) 메뉴 (3) 기타 정보 (4) 주소 (5) 전화번호 (6) 영업일 이었다. 그래서 (2) 메뉴와 (3) 기타 정보의 내용을 통해 종류를 알아낼 예정이다.

 

 

그래서 만든 웹 크롤러의 중요 코드는 다음과 같다.

import pandas as pd
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
import time
import csv

def get_info(url, page):
    wd = webdriver.Chrome('chromedriver', options=chrome_options)
    #wd.get(url)
    
    name_list = [] #가게 이름
    menu_list = [] #메뉴
    etc_list = []  #기타 정보
    address_list = [] #주소
    phone_list = [] #전화번호
    date_list = [] #영업 요일
    
    try:

        wd.get(url)
        
        names = wd.find_elements_by_class_name('tit-point')
        name_list += [name.text for name in names]
        
        menus = wd.find_elements_by_xpath('//*[@id="div_profile"]/div[1]/div[3]')
        #menu_list += [menu.text.split('|')[1] for menu in menus]
        menu_list += [menu.text for menu in menus]

        etcs = wd.find_elements_by_class_name('char')
        etc_list += [etc.text for etc in etcs]

        addresses = wd.find_elements_by_class_name('locat')
        address_list += [address.text for address in addresses]

        phones = wd.find_elements_by_xpath('//*[@id="div_profile"]/div[2]/ul/li[2]')
        phone_list += [phone.text for phone in phones]

        dates = wd.find_elements_by_xpath('//*[@id="div_detail"]/div[1]//ul') 
        date_list += [date.text for date in dates]

       
        
    except NoSuchElementException:
      print('error')
    #shop_df = pd.DataFrame(columns={"이름","메뉴","기타정보","주소","전화번호","영업일"})    
    #shop_df = pd.DataFrame({"이름": name_list,
    #                        "메뉴": menu_list,
    #                        "기타정보": etc_list,
    #                        "주소": address_list,
    #                        "전화번호": phone_list,
    #                        "영업일": date_list})
    #shop_df = shop_df.append(pd.Series([name_list, menu_list, etc_list, address_list, phone_list, date_list], index=shop_df.columns), ignore_index=True)
   
    shop_arr = [name_list, menu_list, etc_list, address_list, phone_list, date_list]

    #shop_df.to_csv('/content/sample_data/dog_dataset.csv', mode='a', encoding='utf-8')
    with open('/content/sample_data/dog_dataset.csv', 'a', encoding='utf-8') as myfile:
      wr = csv.writer(myfile)
      wr.writerow(shop_arr)
    #return shop_df
    return shop_arr

위 크롤러를 통해 약 400개의 데이터셋을 얻었다. 

 


 

2. 데이터 전처리

 

조원들 각자 데이터셋을 수집하고 데이터 형식에 대해 회의를 진행하였다. 그리고 결정된 사항은 다음과 같다.

 

(1) 주소가 null 값인 행은 삭제한다.

(2) 전화번호가 없는 행은 '-'으로 대체한다.

(3) 영업일 형식 통일 --> 영업일의 형태가 너무 다양해 가장 어려웠다. 

                           --> 기존에 있던 '오픈시간', '마감시간' 목록을 '평일', '주말', '휴무' 목록으로 수정하고 시간(00:00)                                   형식으로 통일하기로 하였다.

(4) 가게 이름, 주소, 종류, 아이디가 null값이 되어서는 절대 안 된다.

 

이를 바탕으로 pandas 라이브러리와 수작업을 통해 데이터 전처리를 실시하였다. 그에 대한 코드는 다음 링크를 보면 알 수 있다.

 

https://colab.research.google.com/drive/1_tkNYMH0kh70G4ZBcGYeDISEdQ4eJWnn#scrollTo=XkjRNX8ML8al

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

728x90