pip install selenium
| conda install selenium
from selenium import webdriver
# 크롬 드라이버 경로 지정
driver = webdriver.Chrome('../driver/chromedriver.exe')
# get 명령으로 접근하고 싶은 주소 지정
driver.get('https://www.naver.com')
# 종료 필수
driver.quit()
# 크롬 드라이버 경로 지정
driver = webdriver.Chrome('../driver/chromedriver.exe')
# get 명령으로 접근하고 싶은 주소 지정
driver.get('https://velog.io/@skarb4788/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B84-%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%98%81%ED%99%94-%ED%8F%89%EC%A0%90')
get_window_size()
: 현재 창의 {가로, 세로} 반환
get_window_position()
: 현재 창의 위치 좌표 {x, y} 반환
get_window_rect()
: size, position의 값 반환
화면 크기가 중요한 이유
보이는 화면에 태그가 존재해야지 에러가 발생하지 않는다
# 현재 브라우저 창 크기 확인
print(driver.get_window_size())
print(driver.get_window_position())
print(driver.get_window_rect())
# 브라우저 창 크기 조절
# 현재 보이는 화면에만 액션을 취할 수 있습니다.
driver.set_window_size(1052, 805)
# 화면 최대화
driver.maximize_window()
# 화면 최소화
driver.minimize_window()
# 스크롤 높이 확인
# 자바 스크립트 코드 실행
last_height = driver.execute_script('return document.body.scrollHeight')
last_height
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
driver.save_screenshot('./last_height.png')
driver.execute_script('window.scrollTo(0,0);')
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
some_tag = driver.find_element(By.XPATH, '//*[@id="content"]/div[9]/nav/ul')
action = ActionChains(driver)
action.move_to_element(some_tag).perform()
some_tag = driver.find_element_by_id('''gsc-i-id''')
some_tag.send_keys('data science')
send_keys()
: 주로 검색이나 로그인할 때 사용한다some_tag = driver.find_element_by_xpath(xpath).click()
from bs4 import BeautifulSoup
req = driver.page_source
soup = BeautifulSoup(req, 'html.parser')
result = soup.find_all('div','gsc-webResult gsc-result')
result[0]
from selenium.webdriver.common.by import By
first_content = driver.find_element(By.CSS_SELECTOR, '#content > div.cover-masonry > div > ul > li:nth-child(1)')
first_content.click()
driver.refrech() # 새로고침
driver.back() # 뒤로 가기
driver.forward() # 앞으로 가기
driver.execute_script('window.open("https://www.naver.com")') # 새로운 탭 생성
driver.switch_to.window(driver.window_handles[0]) # 0번째 탭으로 이동
driver.close() # 현재 탭 닫기
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome('../driver/chromedriver.exe')
driver.get('https://www.naver.com')
keyword = driver.find_element(By.ID,'query')
keyword.send_keys('파이썬')
keyword.clear()
keyword.send_keys('딥러닝')
driver.find_element(By.CSS_SELECTOR,'#sform > fieldset > button').click()
keyword.clear()
를 통해 한번 비워야한다XPATH
'//' : 최상위(경로 중 최상위)
'*' : 자손 태그(하위 태그)
'/' : 자식 태그(바로 밑 태그)
driver = webdriver.Chrome('../driver/chromedriver.exe')
driver.get('https://pinkwink.kr')
find_elelmet
find_element_by_css_selector => find, select_one
find_elements_by_css_selector => find_all, select
현재 화면 html 코드 읽기
page_source
키워드 : 원하는 내용을 뷰티풀 수프를 활용하여 찾을 수 있다.iframe
: html 내부에 html을 사용한 것으로 기본적인 select, find로는 찾을 수 없다.
- 돋보기 버튼을 선택
- 검색어를 입력
- 검색 버튼 클릭
from selenium.webdriver import ActionChains
search_tag = driver.find_element(By.CSS_SELECTOR,'.search')
action = ActionChains(driver)
action.click(search_tag)
action.perform()
목표 : 셀프주유소가 저렴한지 확인
목표 데이터 : 브랜드, 가격, 셀프 주유 여부, 위치
from selenium import webdriver
import time
def main_get():
url = 'https://www.opinet.co.kr/searRgSelect.do'
driver = webdriver.Chrome('../driver/chromedriver.exe')
driver.get(url)
main_get()
# 셀레니움은 느려서 한번에 요청하면 에러날 수 있어서 time으로 속도 조절해줘야 한다
# 페이지 접근
url = 'https://www.opinet.co.kr/searRgSelect.do'
driver = webdriver.Chrome('../driver/chromedriver.exe')
driver.get(url)
time.sleep(3)
# 문제가 발생할 경우
# 팝업창 화면 전환 후 닫아주기
# 팝업창으로 전환하기
driver.switch_to_window(driver.window_handels[-1])
팝업창으로 전환 후 닫아주기
driver.close()
time.sleep(3)
다시 원래로 전환해주기
driver.switch_to_window(driver.window_handles[-1])
# 다시 요청
driver.get(url)
sido_list_raw = driver.find_element(By.ID,'SIDO_NM0')
sido_list_raw
sido_list = sido_list_raw.find_elements_by_tag_name('option')
len(sido_list), sido_list[1].text
sido_names = [option.get_attribute('value') for option in sido_list]
sido_names = sido_names[1:]
sido_names
sido_list_raw.send_keys(sido_names[0])
gu_list_raw = driver.find_element(By.ID, 'SIGUNGU_NM0') # 부모 태그
gu_list = gu_list_raw.find_elements(By.TAG_NAME,'option') # 자식 태그
gu_names = [option.get_attribute('value') for option in gu_list]
gu_names = gu_names[1:]
gu_names
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)
driver.find_element(By.ID, 'glopopd_excel').click()
time.sleep(2)
import pandas as pd
from glob import glob
stations = glob('../data/지역_*.xls')
tmp_raw = []
for file_name in stations:
tmp = pd.read_excel(file_name,header=2)
tmp_raw.append(tmp)
station_raw = pd.concat(tmp_raw)
station_raw
stations = pd.DataFrame({
'상호':station_raw['상호'],
'주소':station_raw['주소'],
'가격':station_raw['휘발유'],
'셀프':station_raw['셀프여부'],
'상표':station_raw['상표']
})
stations.tail()
stations['구'] = [eachAddress.split()[1] for eachAddress in stations['주소']]
stations
stations['가격'] = stations['가격'].astype('float')
stations[stations['가격'] == '-']
stations = stations[stations['가격']!='-']
stations.info()
stations.reset_index(inplace=True)
stations
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from matplotlib import rc
%matplotlib inline
rc('font',family='Malgun Gothic')
stations.boxplot(column='가격',by='셀프',figsize=(12,8))
plt.figure(figsize=(12,8))
sns.boxenplot(x='셀프',y='가격',data=stations, palette='Set3')
plt.grid(True)
plt.show()
plt.figure(figsize=(12,8))
sns.boxenplot(x='상표',y='가격',hue='셀프',data=stations, palette='Set3')
plt.grid(True)
plt.show()
import json
import folium
import warnings
warnings.simplefilter(action='ignore',category=FutureWarning) # 경고문 무시
gu_data = pd.pivot_table(data=stations, index='구', values='가격',aggfunc=np.mean)
gu_data.head()
geo_path = '../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')
my_map.choropleth(
geo_data=geo_str,
data=gu_data,
columns=[gu_data.index,'가격'],
key_on='feature.id',
fill_color='PuRd'
)
my_map