본문 바로가기

데이터 청년 캠퍼스(경남대학교)/스터디

2021-07-01

수업시간에 네이버 로그인 크롤링한 것을 바탕으로 학교 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