from selenium import webdriver
url = ''
driver = webdriver.Chrome('../driver/chromedriver')
driver.get(url)
driver.find_element(BY.CSS_SELECTOR, '.gugun_arae_box > li > a').click()
-> .class 밑에 li 밑에 a를 지정
seoul_list_sel = driver.find_elements(BY.CSS_SELECTOR, '#mCSB_3_container ul li')
-> #id 밑에 ul 밑에 li들을 모두 가져옴
from bs4 import BeautifulSoup
html = driver.page_source
dom = BeautifulSoup(html, 'html.parser')
-> 현재 셀레니움으로 접근한 웹페이지 소스 가져오기
seoul_list = dom.select('#mCSB_3_container ul li')
-> beautifulsoup으로 데이터 가져오기 (셀레니움으로는 서울 전체 클릭까지만 이용)
title = seoul_list[0]['data-name']
lat = seoul_list[0]['data-lat']
lng = seoul_list[0]['data-long']
-> 매장명, 위도, 경도 가져오기
address = seoul_list[0].select_one('p').text[:-9]
-> 태그를 선택해서 주소 가져오기, 맨 뒤에 9개의 숫자(전화번호) 삭제
import pandas as pd
from tqdm import tqdm_notebook
datas = []
for content in tqdm_notebook(seoul_list):
title = content['data-name']
address = content.select_one('p').text[:-9]
lat = content['data-lat']
lng = content['data-long']
datas.append({
'title':title,
'address':address,
'lat':lat,
'lng':lng,
)}
driver.close()
df = pd.DataFrame(datas)
df.tail()
-> 전체데이터 가져오기
df['gu'] = df['address'][0].split()[1]
for idx, rows in df.iterrows():
rows['gu'] = df['address'][idx].split()[1]
-> 데이터프레임에 새로운 칼럼('gu') 만들기 (구 이름)
df.to_csv('../data/starbucks.csv', encoding='utf-8')
-> csv 파일 저장
starbucks_df = pd.read_csv('../data/starbucks.csv', index_col=0)
-> csv 데이터 가져오기, 필요없는 첫 번째 컬럼은 가져오지 않음
import pandas as pd
import warnings
from selenium import webdriver
from bs4 import BeautifulSoup
from tqdm import tqdm_notebook
import time
warnings.simplefilter(action='ignore') # 경고 무시
url = ''
driver = webdriver.Chrome('../driver/chromedriver')
driver.get(url)
-> 웹페이지 접속
driver.find_element(BY.CSS_SELECTOR, '복사한 주소').click()
-> 주소 검색탭 선택(CSS_SELECTOR 주소 복사)
starbucks_df = pd.read_csv('../data/starbucks.csv', index_col=0)
gu_list = list(starbucks_df['gu'].unique())
-> 스타벅스 구 리스트 가져오기
gu_list = [str('서울 ') + gu for gu in gu_list]
-> '서울 '을 앞에 붙여주기
search_keyword = driver.find_element(BY.CSS_SELECTOR, '#keyword')
search_keyword.clear() # 입력된 검색어 삭제해주기 (다음 검색어와 중첩되지 않게끔)
search_keyword.send_keys(gu_list[2])
-> 검색어 입력
for gu in gu_list:
search_keyword.send_keys(gu)
search_keywod.clear()
search_button = driver.find_element(BY.CSS_SELECTOR, '복사한 주소')
search_button.click()
-> 돋보기(검색)버튼 누르기
html = driver.page_source
dom = BeautifulSoup(html, 'html.parser') # 현재페이지
contents = dom.select('#placesList li') # 데이터 가져오기
-> 검색결과 리스트 가져오기
title = contents[0].select_one('dt').text
address = contents[0].select_one('dd').text
-> 매장명, 주소 가져오기
url = ''
driver = webdriver.Chrome('../driver/chromedriver')
driver.get(url)
driver.find_element(BY.CSS_SELECTOR, '복사한 주소').click()
search_keyword = driver.find_element(BY.CSS_SELECTOR, '#keyword')
search_button = driver.find_element(BY.CSS_SELECTOR, '복사한 주소')
time.sleep(1)
datas = []
for gu in gu_list:
search_keyword.clear()
search_keyword.send_keys(gu)
search_button.click()
time.sleep(1)
html = driver.page_source
dom = BeautifulSoup(html, 'html.parser')
contents = dom.select('#placesList li')
for content in contents:
title = content.select_one('dt').text
address = content.select_one('dd').text
datas.append({
'title':title,
'address':address
})
driver.close()
df = pd.DataFrame(datas)
-> 전체 데이터 수집(처음부터 쭉 전체 코드)
for idx, rows in df.iterrows():
rows['gu'] = df['address'][idx].split(' ')[1]
df['gu'].unique()
-> 구 칼럼 만들기
import googlemaps
gmaps_key = '발급된 키값'
gmaps = googlemaps.Client(key=gmaps_key)
-> 위도,경도 가져오기 위한 작업
import numpy as np
df['lat'] = np.nan
df['lng'] = np.nan # 일단 칼럼 만들어줌
for idx, rows in tqdm_notebook(df.iterrows()):
address = rows['address']
tmp = gmaps.geocode(address, language='ko') # 검색어:address, 언어:한국어
tmp[0].get('formatted_address')
lat = tmp[0].get('geometry')['location']['lat']
lng = tmp[0].get('geometry')['location']['lng']
df.loc[idx, 'lat'] = lat
df.loc[idx, 'lng'] = lng # 위도, 경도를 각 칼럼에 넣어줌
df.to_csv('../data/ediya.csv', encoding='utf-8')
ediya_df = pd.read_csv('../data/ediya.csv', index_col=0)
import pandas as pd
stb_df = pd.read_csv('../data/starbucks.csv', encoding='utf-8', index_col=0)
ediya_df = pd.read_csv('../data/ediya.csv', encoding='utf-8', index_col=0)
stb_df['brand'] = '스타벅스'
ediya_df['brand'] = '이디야'
-> 두 데이터를 합칠 때, 구분되도록 브랜드명 칼럼을 만들어줌
cafe_df = pd.concat([stb_df, ediya_df], axis=0)
-> 두 데이터프레임 합치기
cafe_df.reset_index(inplace=True)
del cafe_df['index']
-> 새로운 인덱스를 달아주고, 기존 인덱스 삭제
import matplotlib.pyplot as plt
%matplotlib inline
from matplotlib import rc
rc("font", family="Malgun Gothic")
-> 한글 대응 코드
cafe_df['gu'][cafe_df['brand'] == '스타벅스'].value_counts(ascending=False)[:5]
-> 스타벅스 매장의 구별 매장수 구하기 (내림차순 정렬, 상위5개)
cafe_df['gu'][cafe_df['brand'] == '이디야'].value_counts(ascending=False)[:5]
-> 이디야 매장의 구별 매장수 구하기 (내림차순 정렬, 상위5개)
df1 = cafe_df.groupby(['gu', 'brand'])['title'].count().reset_index(name='shop_count')
-> 구별로 스타벅스, 이디야가 각 몇 개씩 분포해있는지 보여주는 df 만들기
import numpy as np
df1.pivot_table(index='gu', columns='brand', aggfunc=np.sum)
-> 보기 편하도록 피벗테이블로 만들기
plt.figure(figsize=(24, 6))
sns.barplot(data=df1, x=df1['gu'], y=df1['shop_count'], hue='brand', palette='Set1')
plt.show()
-> 구별 매장수를 막대그래프(barplot)로 그려주기
plt.figure(figsize=(24, 6))
sns.barplot(data=df1, x=df1['gu'], y=df1['shop_count'], hue='brand', dodge=False, alpha=0.8, palette='Set1')
plt.show()
-> dodge=False: 그래프를 겹치도록 하기, alpha: 투명도를 다르게 줌
stb_df_m = stb_df.groupby(['gu', 'brand'])['title'].count().reset_index(name='shop_count')
stb_df_m = stb_df_m.pivot_table(index='gu')
edi_df_m = ediya_df.groupby(['gu', 'brand'])['title'].count().reset_index(name='shop_count')
edi_df_m = edi_df_m.pivot_table(index='gu')
import folium
import json
geo_path = '../data/02. skorea_municipalities_geo_simple.json'
geo_str = json.load(open(geo_path, encoding='utf-8'))
sta_m = folium.Map(location=[37.5502, 126.982], zoom_start=12) # 서울이 잘 보이는 위치로 지정
sta_m.choropleth(
geo_data=geo_str,
data=stb_df_m['shop_count'],
columns=[stb_df_m.index, stb_df_m['shop_count']],
fill_color='PuRd',
key_on='feature.id'
) # 구별 경계선 그리기 (색깔은 매장개수)
for idx, rows in stb_df.iterrows():
folium.Circle(
location=[rows['lat'], rows['lng']],
radius=100,
popup=rows['title'] + '점',
color='#2c9147', fill_color='#2c9147'
).add_to(sta_m) # 스타벅스 매장 위치 찍어주기
edi_m = folium.Map(location=[37.5502, 126.982], zoom_start=12) # 서울이 잘 보이는 위치로 지정
edi_m.choropleth(
geo_data=geo_str,
data=edi_df_m['shop_count'],
columns=[edi_df_m.index, edi_df_m['shop_count']],
fill_color='PuRd',
key_on='feature.id'
) # 구별 경계선 그리기 (색깔은 매장개수)
for idx, rows in ediya_df.iterrows():
folium.Circle(
location=[rows['lat'], rows['lng']],
radius=100,
popup=rows['title'] + '점',
color='#5882FA', fill_color='#5882FA'
).add_to(edi_m) # 이디야 매장 위치 찍어주기
sta_edi_m = folium.Map(location=[37.5502, 126.982], zoom_start=12) # 서울이 잘 보이는 위치로 지정
sta_edi_m.choropleth(
geo_data=geo_str,
data=stb_df_m['shop_count'],
columns=[stb_df_m.index, stb_df_m['shop_count']],
fill_color='PuRd',
key_on='feature.id'
) # 구별 경계선 그리기 (색깔은 매장개수)
for idx, rows in stb_df.iterrows():
folium.Circle(
location=[rows['lat'], rows['lng']],
radius=100,
popup=rows['title'] + '점',
color='#2c9147', fill_color='#2c9147'
).add_to(sta_edi_m) # 스타벅스 매장 위치 찍어주기
for idx, rows in ediya_df.iterrows():
folium.Circle(
location=[rows['lat'], rows['lng']],
radius=100,
popup=rows['title'] + '점',
color='#5882FA', fill_color='#5882FA'
).add_to(sta_edi_m) # 이디야 매장 위치 찍어주기
-> 스타벅스, 이디야 매장위치 지도시각화
<제로베이스 데이터 취업 스쿨>