Notice
Recent Posts
Recent Comments
Link
헬창 개발자
4. 셀프 주유소는 정말 저렴할까? 본문
학습전 하기
https://health-coding.tistory.com/37
학습 목표
- Selenium 모듈 이해
0. 들어가기 전
- Selenium VS BeautifulSoup
Selenium BeautifulSoup
웹 동작 | html 정보 파싱 |
javascript 렌더링을 통해 생성되는 데이터들을 손쉽게 가져올 수 있다. | python 내장 모듈 requests나 urllib을 이용해 HTML을 다운 받고, beautifulsoup으로 테이터를 추출한다. |
웹 브라우저를 실제로 진행시키는 방법이기 때문에 속도도 많이 느리고, 메모리도 상대적으로 많이 차지한다. | 서버에서 HTML을 다운 받기 때문에 javascipt 렌더링을 필요로 하는 사이트들은 크롤링하기 까다롭다. |
- Xpath란?
<!-- 우리가 찾아야할 것은 body라는 태그 하나로 끝나는 것이 아니다 각 태그에는 속성도 있고 속성값도 있고 태그의 내용물도 있다 --> <html> <body style="s2" class="top"> test </body> </html> <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book> <title lang="en">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="en">Learning XML</title> <price>39.95</price> </book>2 </bookstore>
- book을 찾고싶을때 /bookstore/book[1]
- 수식을 적용 /bookstore/book[price>35.00]
1. 주유소 정보 확인
- 대한민국 주유 가격 - 지역별 : 링크
- 목표 데이터 : 브랜드, 가격, 셀프 주유 여부, 위치
- 데이터가 바뀌어도 주소가 변경되지 않아 BeautifulSoup로 접근하기 어렵다
- 주유소 가격 정보 흭득
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
driver = webdriver.Chrome('../BI/driver/chromedriver.exe')
driver.get("https://www.opinet.co.kr/searRgSelect.do")
time.sleep(3)
# 가장싼주유소의 Xpath 경로
xpath="""//*[@id="quick_ul"]/li[2]/a/span"""
driver.find_element_by_xpath(xpath).click()
2. 주유소 가격 정보 저장
- Xpath로 시군구 접근하기
새폴더를 만들어서 한곳에 넣기from tqdm import notebook # 시의 Xpath 경로 xpath="""//*[@id="SIDO_NM0"]/option[2]""" driver.find_element_by_xpath(xpath).click() for n in notebook.tqdm(range(1,27)): # 구의 Xpath 경로 xpath='//*[@id="SIGUNGU_NM0"]/option'+'['+str(n)+']' driver.find_element_by_xpath(xpath).click() time.sleep(3) #excel xpath="""//*[@id="glopopd_excel"]/span""" driver.find_element_by_xpath(xpath).click() time.sleep(3)
- 엑셀 파일 확인
행을 기준으로 2번째까지는 필요없는 행이다.
- 엑셀파일 한번에 불러오기
-
from glob import glob import pandas as pd stations_files = glob("C:/Users/BI/Downloads/새 폴더/*.xls") tmp = pd.read_excel(stations_files[0], header=2) tmp.head(2)
- 불러온 데이터 합치기
tmp_raw = [] for file_name in stations_files: tmp = pd.read_excel(file_name, header=2) tmp_raw.append(tmp) station_raw = pd.concat(tmp_raw)
- 정보 확인
station_raw.info()
- 정보 확인
- 필요 데이터만 추출
# 데이터 추출 stations = pd.DataFrame( { "상호" : station_raw.get("상호"), "주소" : station_raw.get("주소"), "가격" : station_raw.get("휘발유"), "셀프" : station_raw.get("셀프여부"), "상표" : station_raw.get("상표"), } ) # 구 정보 추가 stations["구"] = [eachAddress.split()[1] for eachAddress in stations.get("주소")] # 가격 타입 변경 # 없는 값 제외 stations = stations[stations["가격"] != "-"] # 타입 변경 stations["가격"] = stations["가격"].astype("float") # 인덱스 번호 재설정 stations.reset_index(inplace=True) # 이전의 index 컬럼 삭제 del stations['index'] stations.tail(2)
4. 주유소 가격 시각화
- 데이터 저장 및 회사별 시각화
stations.to_excel('C:/Users/BI/Downloads/새 폴더/05. stations_final.xlsx', encoding='utf-8') stations = pd.read_excel('C:/Users/BI/Downloads/새 폴더/05. stations_final.xlsx', index_col = 0) import matplotlib.pyplot as plt from matplotlib import rc %matplotlib inline # get_ipython().run_line_magic("matplotlib", "inline") plt.rcParams["axes.unicode_minus"] = False rc('font', family='Malgun Gothic') import warnings warnings.simplefilter(action="ignore", category=FutureWarning) plt.figure(figsize=(12, 8)) sns.boxplot(x='상표', y='가격', hue = '셀프', data=stations, palette="Set3") plt.grid() plt.show()
- 구별 평균값
import numpy as np gu_data = pd.pivot_table( data = stations, index = ["구"], values = ["가격"], aggfunc = np.mean ) gu_data.head()
- 지도 시각화
import json geo_path = "C:/Users/BI/DataScience/data/02. skorea_municipalities_geo_simple.json" geo_str = json.load(open(geo_path, encoding="utf-8")) my_map = folium.Map( location=[37.5502, 126.982], zoom_start=10.5, tiles="Stamen Toner" ) folium.Choropleth( geo_data = geo_str, data = gu_data, columns = [gu_data.index, "가격"], key_on = "feature.id", fill_color = "PuRd" ).add_to(my_map) my_map
종로구, 중구, 용산구가 비교적 저렴하지 않다는것을 알 수 있음
- 지도 시각화
- 엑셀 파일 확인
행을 기준으로 2번째까지는 필요없는 행이다.
'데이터 분석' 카테고리의 다른 글
8. 자연어 처리 시작하기 (0) | 2022.04.17 |
---|---|
k-means 알고리즘 [파이썬] (0) | 2022.04.17 |
Selenium 기초 (0) | 2022.02.15 |
3. 네이버 영화 평점 크롤링 (4) | 2022.02.15 |
2. 서울시 범죄 현황 분석 (0) | 2022.02.15 |
Comments