수업시간에 네이버 로그인 크롤링한 것을 바탕으로 학교 lms 로그인 하는 것 작성해 보기
!pip install selenium
from selenium import webdriver
driver = webdriver.Chrome( 'C:\data\chromedriver')
driver.get("https://cyberweb.kmou.ac.kr") #학교 홈페이지 열기
#아이디 입력을 위한 xpath
school_id = driver.find_element_by_xpath('//*[@id="id"]')
school_id.clear()
school_id.send_keys('********')
#비밀번호 입력
school_pd = driver.find_element_by_xpath('//*[@id="pw"]')
school_pd.clear()
school_pd.send_keys('********')
하지만 학교측에서 막아놨는지 오류 발생
xpath='//*[@id="loginForm"]/fieldset/p/a'
driver.find_element_by_xpath(xpath).click()
위에서 오류가 발생해서 여기도 오류가 발생
그래서 학교 lms로그인 하는 것은 포기,,,,
수업시간에는 서울시의 주유소를 크롤링해서 시각화를 했음
나는 부산시의 주유소를 크롤링하기로 결정!
from selenium import webdriver
driver = webdriver.Chrome('C:\data\chromedriver')
driver.get("http://www.opinet.co.kr")
driver.get("http://www.opinet.co.kr/searRgSelect.do") #크롤링 할 사이트?주소 열기
크롤링을 위한 페이지 열기
area = driver.find_element_by_xpath('//*[@id="SIDO_NM0"]')
area.send_keys('부산')
gu_list_raw = driver.find_element_by_xpath('//*[@id="SIGUNGU_NM0"]')
#시/군/구의 xpath
gu_list = gu_list_raw.find_elements_by_tag_name('option')#??
gu_names = [option.get_attribute('value') for option in gu_list]
gu_names.remove('') #시/군/구 value가 공백
import time
from tqdm import tqdm_notebook #진행되는 과정을 보여줌
# 반복문을 이용하여 모든 구 엑셀파일 다운로드 진행
for gu in tqdm_notebook(gu_names):
element = driver.find_element_by_id('SIGUNGU_NM0')
element.send_keys(gu)
time.sleep(2)# 데이터 획득 위한 지연 시간
xpath ='''//*[@id="searRgSelect"]/span'''
element_sel_gu = driver.find_element_by_xpath(xpath).click()
time.sleep(1)
xpath = '''//*[@id="glopopd_excel"]/span'''
element_get_excel = driver.find_element_by_xpath(xpath).click()
time.sleep(1)
데이터를 전부 다운받고
파일의 위치를 조정한다음
import pandas as pd
from glob import glob
stations_files = glob('지역*.xls')
stations_files
파일들을 리스트로 저장
# concat 명령으로 합쳐본다.
tmp_raw = []
for file_name in stations_files:
tmp = pd.read_excel(file_name, header=2) #맨 위의 3줄 삭제?
tmp_raw.append(tmp)
station_raw = pd.concat(tmp_raw)
모든 파일들을 하나의 엑셀로 만들고
station_raw.info()
파일들의 정보를 살펴보면 총 398개의 데이터가 있고 모두 오브젝트 타입인 것을 알 수 있음. 결측값은 없음
# 경유 데이터 저장.
stations = pd.DataFrame({'Oil_store': station_raw['상호'],
'주소': station_raw['주소'],
'가격': station_raw['경유'],
'셀프': station_raw['셀프여부'],
'상표': station_raw['상표']
})
stations.head()
수업시간에는 휘발유로 해서 경유로 바꿔서 해 봄! 그래서 각각의 열 들에 이름을 부여하는 작업? 바꾸는 작업?
stations['구'] = [eachAddress.split()[1] for eachAddress in stations['주소']]
stations.head()
주소에 있는 구 정보만 따로 열을 만듦
stations['구'].unique() #구에 있는 값을 하나 하나 뽑아내는것?
어떤 구가 있는지 확인
stations['가격'].unique() #가격에 '-'가 있음
모든 가격 값을 확인 가능한데 가격 값중에 '-'이 있는 것을 확인 할 수 있음
# '-' 문자가 포함된 데이터 제외
stations = stations[stations['가격'] != '-']
# 가격 float 형 변환.
stations['가격'] = [float(value) for value in stations['가격']]
# reset_index 이용하여 index 재정의
stations.reset_index(inplace=True)
del stations['index']# 기존 인덱스 삭제
시각화
import matplotlib.pyplot as plt
import seaborn as sns
# 라이브러리 임포트 및 한글 글꼴 설정
from matplotlib import font_manager, rc
import platform
font_path = ''
if platform.system() == 'Windows':
font_path = 'c:/Windows/Fonts/malgun.ttf'
font_name = font_manager.FontProperties(fname = font_path).get_name()
rc('font', family = font_name)
elif platform.system() == 'Darwin':
font_path = '/Users/$USER/Library/Fonts/AppleGothic.ttf'
rc('font', family = 'AppleGothic')
else:
print('Check your OS system')
%matplotlib inline
stations.boxplot(column='가격', by='셀프', figsize=(12,8))
plt.show()
셀프주유소인지 아닌지에 대한 정보로 나누고 거기서 가격을 박스플롯으로 그리기 셀프주유소인곳이 더 싼 것을 확인 할 수 있음
plt.figure(figsize=(12,8))
sns.boxplot(x='상표', y='가격', hue='셀프', data=stations, palette='Set3')
plt.show()
그 다음은 주유소별로 박스플롯 그리기 같은 브랜드의 주유소라도 셀프 주유소가 더 저렴하고, sk에너지가 가장 비싸고 알뜰 주유소가 저렴한 것을 확인 할 수 있음
plt.figure(figsize=(12,8))
sns.boxplot(x='상표', y='가격', data=stations, palette='Set3')
sns.swarmplot(x='상표', y='가격', data=stations, color='.6')
plt.show()
각 브랜드에 해당하는 주유소의 박스플롯에 각각의 데이터를 점으로 표현
!pip install json
!pip install folium
!pip install googlemaps
import json
import folium
import googlemaps
#부산시에서 가장 주유 가격이 비싼 주유소
stations.sort_values(by='가격', ascending=False).head(10)
가격이 비싼 순서대로 나열
# pivot_table을 이용해서 구별 가격 정보로 변경하고 가격 평균값 정리.
import numpy as np
gu_data = pd.pivot_table(stations, index=['구'], values=['가격'], aggfunc=np.mean)
gu_data.head()
구별로 가격의 평균값
#busan_gu.json
# 부산시 구별 정보에 대해 지도로 표현
geo_path = 'busan_gu.json'
geo_str = json.load(open(geo_path, encoding='utf-8'))
map = folium.Map(location=[35.1856505,129.1], zoom_start=10.5,
tiles='Stamen Toner')
map.choropleth(geo_data = geo_str,
data = gu_data,
columns=[gu_data.index, '가격'],
fill_color='PuRd', #PuRd, YlGnBu
key_on='feature.id')
map
구별로 가격을 지도에 색깔로 표시 색깔이 진할수록 비싼 지역 부산의 json파일은 블로그에서 다운받았음
oil_price_top10 = stations.sort_values(by='가격', ascending=False).head(10)
oil_price_top10
# 하위 10개 oil_price_bottom10 저장
oil_price_bottom10 = stations.sort_values(by='가격',
ascending=True).head(10)
oil_price_bottom10
가격이 비싼거 순서대로 10개 싼 순서대로 10개
from tqdm import tqdm_notebook
gmaps_key = 'AIzaSyDekfiVYSFscguylCGOYdtGTjwf0twUubE' # API설정할 때 얻은 key
gmaps = googlemaps.Client(key=gmaps_key)
lat = []
lng = []
for n in tqdm_notebook(oil_price_top10.index):
try:
tmp_add = str(oil_price_top10['주소'][n]).split('(')[0]
tmp_map = gmaps.geocode(tmp_add)
tmp_loc = tmp_map[0].get('geometry')
lat.append(tmp_loc['location']['lat'])
lng.append(tmp_loc['location']['lng'])
except:
lat.append(np.nan)
lng.append(np.nan)
print('Here is nan !')
oil_price_top10['lat']=lat
oil_price_top10['lng']=lng
oil_price_top10
lat = []
lng = []
for n in tqdm_notebook(oil_price_bottom10.index):
try:
tmp_add = str(oil_price_bottom10['주소'][n]).split('(')[0] #괄호 제거
tmp_map = gmaps.geocode(tmp_add)
tmp_loc = tmp_map[0].get('geometry')
lat.append(tmp_loc['location']['lat'])
lng.append(tmp_loc['location']['lng'])
except:
lat.append(np.nan)
lng.append(np.nan)
print('Here is nan !')
oil_price_bottom10['lat']=lat
oil_price_bottom10['lng']=lng
oil_price_bottom10
주소의 위도와 경도를 추가하는 작업 각각 가격의 상위 10개와 하위 10개에 대해서!
map = folium.Map(location=[35.1856505,129.1], zoom_start=10.5)
for n in oil_price_top10.index:
if pd.notnull(oil_price_top10['lat'][n]):
folium.CircleMarker([oil_price_top10['lat'][n],
oil_price_top10['lng'][n]],
radius=15, color='#CD3181',
fill_color='#CD3181').add_to(map)
for n in oil_price_bottom10.index:
if pd.notnull(oil_price_bottom10['lat'][n]):
folium.CircleMarker([oil_price_bottom10['lat'][n],
oil_price_bottom10['lng'][n]],
radius=15, color='#3186cc',
fill_color='#3186cc').add_to(map)
map
지도에 원으로 표시!
'데이터 청년 캠퍼스(경남대학교) > 스터디' 카테고리의 다른 글
2021-07-12 (0) | 2021.07.12 |
---|---|
2021 - 07 - 07 (0) | 2021.07.07 |
2021-07-06 (0) | 2021.07.06 |
2021-07-05 (0) | 2021.07.05 |
2021 - 06 - 30 (0) | 2021.07.01 |