일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- INSERT
- 조합
- pandas
- pandas filter
- pandas 메소드
- plt
- 기계학습
- 재귀함수
- 통계학
- SQL
- 문제풀이
- python
- numpy
- tree.fit
- 머신러닝
- matplotlib
- 등비수열
- 스터디노트
- barh
- DataFrame
- maplotlib
- 리스트
- Folium
- 순열
- 파이썬
- 자료구조
- 등차수열
- Machine Learning
- Slicing
- MacOS
Archives
- Today
- Total
코딩하는 타코야끼
[스터디 노트] Week6_3일차 [unit1 ~ 13] - EDA(유가 분석) 본문
728x90
반응형
1. Selenium 설치
📍 Selenium
- Selenium은 웹 애플리케이션 테스트를 위한 프레임워크입니다.
- 원래 웹 애플리케이션의 자동화 테스트를 위해 개발되었지만, 웹 브라우저를 자동화하는 도구로서 크롤링, 웹 사이트의 자동화 테스트, 웹 UI를 통한 작업 자동화 등 다양한 작업에 널리 사용됩니다.
- 웹 브라우저를 원격 조작하는 도구
- 자동으로 URL을 열고 클릭 등이 가능
- 스크롤, 문자의 입력, 화면 캡처 등등
!pip install selenium
📍 ChromeDriver Download - URL
- Chrome 버전에 맞는 Driver 다운받기
- https://chromedriver.chromium.org/downloads
2. Selenium 기초
📍 webdriver 사용하기
from selenium import webdriver
# ChromeOptions 객체를 생성합니다.
chrome_options = webdriver.ChromeOptions()
# 웹드라이버의 경로를 설정합니다.
chrome_options.binary_location = "../ds_study/unit4/driver/chromedriver"
# Chrome 웹드라이버를 초기화합니다.
driver = webdriver.Chrome(options = chrome_options)
# 원하는 웹 페이지에 접근합니다.
driver.get("<https://pinkwink.kr/>")
# 스크롤 가능한 높이
last_height = driver.execute_script("return document.body.scrollHeight")
last_height
>>>
5615
📍 화면 스크롤
# 화면 스크롤 -> 맨 아래로
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
📍 찾는 xpath지점까지 스크롤하는 코드
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
# By.XPATH를 사용하여 XPATH라는 방식을 지정하고, 그 다음 인수로 실제 Xpath 문자열을 전달합니다.
some_tag = driver.find_element(By.XPATH, '''//*[@id="content"]/div[9]/nav/ul/li[1]/a''')
action = ActionChains(driver)
action.move_to_element(some_tag).perform()
📍 value 로 찾기
some_tag = driver.find_element(By.NAME, 'search')
some_tag.send_keys("data science")
📍검색 엔터로 화면 넘어가기
from selenium.webdriver.common.keys import Keys
some_tag.send_keys(Keys.ENTER)
📍 현재 화면의 html코드 가져오기
from bs4 import BeautifulSoup
req = driver.page_source
soup = BeautifulSoup(req, "html.parser")
# 이러한 방식으로 접근 가능
result = soup.find_all("div", "post-item")
result[0]
>>>
<div class="post-item">
<a href="/1363">
<span class="thum">
<img alt="" src="//i1.daumcdn.net/thumb/C264x200/?fname=https://blog.kakaocdn.net/dna/bagkwX/btrgi1Ju3KA/AAAAAAAAAAAAAAAAAAAAAOOEio-04qpR1is90Xyof1VoB9f4gF_VZFeYLMJfUo_d/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=TXxZTSalRxUTBINlie9wLf3VN%2BI%3D"/>
</span>
<span class="title">Selenium 처음 시작해 보기</span>
<span class="date">2021. 9. 30. 08:00</span>
<span class="excerpt">오랜만에 Data Science 카테고리에 글을 올리네요. 예전에 웹에서 데이터를 가지고 오는 간단한 방법을 이야기했던 적이 있습니다. 오늘은 그 글에서 이어지는 내용입니다. 웹상에서 어떤 입력폼에 글자를 입력한다든지, 접근해야할 상세 웹 주소가 보이지 않는다든지 등의 상황에서 유용하게 사용할 수 있는 도구가 selenium입니다. 위 그림에 나타나있듯이 selenium은 사용하는 브라우저에 맞춰 드라이버를 실행합니다. 그러면 해당 드라이버가 웹페이지를 읽을 브라우저를 실행해서 나의 코드에 의해 제어되도록 되는 것입니다. 설치는 pip 명령으로 먼저 진행하구요. 아래 그림처럼 자신의 크롬 버전을 확인합니다. 우측 상단 점 세개를 클릭한 다음 도움말의 크롬 버전을 확인하시면 됩니다. 크롬드라이버 다운로드 ..</span>
</a>
</div>
3. 데이터 얻어오기
📍사이트 구조 분석
- 지역을 선택해도 드러난 웹 주소가 변경되지 않는다.
- 생각보다 HTML 소스에서 원하는 정보를 얻는 것도 쉬워보이지 않는다
📍 지역 데이터 갖고오기
from selenium.webdriver.common.by import By
sido_list_row = driver.find_element(By.ID, '''SIDO_NM0''')
- option 이라는 태그 안에 광역시도의 값을 받아와야 한다.
# 다수의 element 값을 가져올 때는 "find_elements"입력
sido_list = sido_list_row.find_elements(By.TAG_NAME, "option")
sido_names = [option.get_attribute("value") for option in sido_list]
sido_names.remove('')
sido_names
>>>
['서울특별시',
'부산광역시',
'대구광역시',
'인천광역시',
'광주광역시',
'대전광역시',
'울산광역시',
'세종특별자치시',
'경기도',
'충청북도',
'충청남도',
'전라북도',
'전라남도',
'경상북도',
'경상남도',
'제주특별자치도',
'강원특별자치도']
from selenium.webdriver.common.keys import Keys
sido_list_row.send_keys(sido_names[1])
- '서울'에서 sido_name에 1번 index인 '부산'으로 바뀜
📍 시/군/구 가져오기
# 시군구 id list 가져오기
sigungu_list_row = driver.find_element(By.ID, '''SIGUNGU_NM0''')
# 시군구 id 안에 option tag 리스트 가져오기
sigungu_list = sigungu_list_row.find_elements(By.TAG_NAME, "option")
>>>
<selenium.webdriver.remote.webelement.WebElement (session="3e9a1381b1d364b20cf497a9ec319a99", element="270869976C318124DA8428FF2382D7D3_element_335")>
# option tag 리스트에서 value 값만 가져오 리스트에 저장
sigungu_names = [option.get_attribute("value") for option in sigungu_list]
sigungu_names.remove('')
sigungu_list_row.send_keys(sigungu_names[1])
4. 엑셀 파일 가져오기
📍 id 조회 후 클릭으로 파일 저장
element_get_excel = driver.find_element(By.ID, "glopopd_excel").click()
📍 반복문으로 모든 구의 데이터를 엑셀 파일로 저장
import time
from tqdm import tqdm_notebook
for gu in tqdm_notebook(sigungu_names):
option = driver.find_element(By.ID, "SIGUNGU_NM0")
option.send_keys(gu)
time.sleep(2)
excel_download = driver.find_element(By.ID, "glopopd_excel").click()
time.sleep(1)
📍드라이버 종료
driver.close()
5. 데이터 정리하기
📍하나만 읽어서 확인하기
tmp = pd.read_excel(stations_files[0], header = 2)
tmp.head()
📍 25개 구의 주요소 excel 파일 불러오기 및 통합
tmp_raw = []
for file_name in stations_files:
file = pd.read_excel(file_name, header = 2)
tmp_raw.append(file)
stations_raw = pd.concat(tmp_raw)
stations_raw.info()
>>>
<class 'pandas.core.frame.DataFrame'>
Int64Index: 441 entries, 0 to 8
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 지역 441 non-null object
1 상호 441 non-null object
2 주소 441 non-null object
3 상표 441 non-null object
4 전화번호 441 non-null object
5 셀프여부 441 non-null object
6 고급휘발유 441 non-null object
7 휘발유 441 non-null object
8 경유 441 non-null object
9 실내등유 441 non-null object
dtypes: object(10)
memory usage: 37.9+ KB
📍 구 컬럼 생성
stations["구"] = [address.split()[1] for address in stations["주소"]]
stations["구"].unique()
>>>
array(['도봉구', '마포구', '광진구', '중랑구', '관악구', '서대문구', '노원구', '강서구', '양천구',
'종로구', '서초구', '성동구', '중구', '영등포구', '강북구', '용산구', '강동구', '성북구',
'송파구', '은평구', '동대문구', '강남구', '금천구', '구로구', '동작구'], dtype=object)
📍 이상한 value가 있을 시
📍 이상치 정리
# "가격"컬럼의 value 중 이상치 "-" 값을 뺀 데이터만 다시 저장한다
stations = stations[stations["가격"] != "-"]
# "가격" 컬럼의 type를 float(실수)로 변환.
stations["가격"] = stations["가격"].astype("float")
# 확인
stations.info()
>>>
<class 'pandas.core.frame.DataFrame'>
Int64Index: 440 entries, 0 to 8
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 상호 440 non-null object
1 주소 440 non-null object
2 가격 440 non-null float64
3 셀프 440 non-null object
4 상표 440 non-null object
5 구 440 non-null object
dtypes: float64(1), object(5)
memory usage: 24.1+ KB
# 각 index에 번호 지정
stations.reset_index(inplace = True)
# 불필요 column 삭제
del stations["index"]
# 확인
stations.head()
6. 주유 가격 시각화
plt.figure(figsize = (10, 6))
sns.boxplot(x = "상표", y = "가격", hue = "셀프", data = stations, palette = "Set3")
plt.grid()
plt.show()
반응형
'zero-base 데이터 취업 스쿨 > 스터디 노트' 카테고리의 다른 글
[스터디 노트] Week7_2일차 [unit_1 ~ 7] - EDA(Naver API) (0) | 2023.08.18 |
---|---|
[스터디 노트] Week7_1일차 [Prophet] - EDA(시계열 분석) (0) | 2023.08.16 |
[스터디 노트] Week6_2일차 [unit14 ~ 20] - EDA(웹데이터) (2) | 2023.08.16 |
[스터디 노트] Week6_1일차 [unit1 ~ 13] - EDA(웹데이터) (0) | 2023.08.16 |
[스터디 노트] Week5_5일차 [unit22 ~ 32] - EDA(범죄) (2) | 2023.08.16 |