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
'Backend' 카테고리의 다른 글
| [DB 프로젝트 5] 로그인 기능 구현 (0) | 2021.11.19 |
|---|---|
| [DB 프로젝트 4] MySQL 엑셀(csv) 데이터 로드 (0) | 2021.11.18 |
| [DB 프로젝트 4] JSP 개요 (0) | 2021.11.17 |
| [DB 프로젝트 3] JDBC 개요 (0) | 2021.11.17 |
| [DB 프로젝트 1] php 개요 (0) | 2021.11.10 |