프로젝트 - 유가분석 (1)

Jungmin·2022년 10월 20일
1

데이터 분석

목록 보기
13/24

프로젝트 04. Self Oil Station Price Analysis

1. selenium

-웹 브라우저를 원격 조작하는 도구
-자동으로 URL을 열고 클릭 등이 가능
-스크롤, 문자 입력, 화면 캡처 등등

  • conda install selenium
  • chromedriver 설치
!pip install selenium
import requests

from selenium import webdriver
# 크롬 드라이버 경로 지정
driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get("https://www.naver.com/")
# 종료 필수
driver.quit()

selenium basic

import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
# get 명령으로 접근하고 싶은 주소 지정
driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get("http://pinkwink.kr/")

  • 현재 브라우저 창 크기 확인
    get_window_size() : 현재 창의 {가로, 세로} 반환
    get_window_position() : 현재 창의 위치 좌표 {x, y} 반환
    get_window_rect() : size, position의 값 반환
# 현재 브라우저 창 크기
driver.get_window_size()

--> {'width': 1051, 'height': 798}

# 좌표값
driver.get_window_position()

--> {'x': 9, 'y': 9}

# size, position 값
driver.get_window_rect()

--> {'height': 798, 'width': 1051, 'x': 9, 'y': 9}

#스크롤 가능한 높이(길이)
driver.execute_script("return document.body.scrollHeight")

--> 666

#화면 스크롤 ->하단 이동
driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
#화면 스크롤 ->상단 이동
driver.execute_script("window.scrollTo(0,0);")
# 스크린샷 
driver.save_screenshot("../last_height.png")

--> True

-화면 페이지 지정 : xpath

# 특정태그 지점까지 스크롤 -->'AI 관련 최신글' 로 이동

from selenium.webdriver import ActionChains
some_tag = driver.find_element(By.XPATH,r'//*[@id="content"]/div[3]/div/h2')  # 개발자도구로 원하는 태그 copy-->xpath
action = ActionChains(driver)
action.move_to_element(some_tag).perform()

# 입력 창에 글자 넣기
some_tag = driver.find_element(By.XPATH,'//*[@id="header"]/div[2]/input').send_keys("data science")

# 브라우저 창 크기 조절
# 현재 보이는 화면에서만 액션을 취할 수 있다. 
driver.set_window_size(1920,1080)
# 화면 최대화
driver.maximize_window()
# 화면 최소화
# driver.minimize_window()
#검색창 단어 추가 
driver.find_element(By.XPATH,'//*[@id="header"]/div[2]/input').send_keys("python")
#검색창 단어 지우기 
driver.find_element(By.XPATH,'//*[@id="header"]/div[2]/input').clear()
# some_tag.clear()

XPATH

  • //:최상위 element태그
    • :자손 태그 검색 -> div form (띄어쓰기) = 자손태그 검색
  • / :자식 태그 검색 -> div > form ('>'사용) = 자식태그 검색
  • td[2] :td 태그 중 2번째 태그 선택 = td:nth_child(2)
# XPATH 

xpath = '//*[@id="header"]/div[2]/button'
some_tag = driver.find_element(By.XPATH,(xpath))
some_tag.click()
# 클릭버튼 copy selector --> '#header > div.search.on > button' 
driver.find_element(By.CSS_SELECTOR,'#header > div.search.on > button').click()
driver.back()  #창 뒤로 가기 
driver.forward() 
from bs4 import BeautifulSoup

req  = driver.page_source
#현재 웹드라이버가 연 화면의 page source,HTML이 출력
soup = BeautifulSoup(req, "html.parser")
elements = soup.select('#content')
elements[0].text
```python
'\n\npython\n(248)\n\n썸네일형\n리스트형\n\n\n\n\n\n\n\n\nROS2 혼자 공부하기 좋은 책 추천 - ROS2 혼자 공부하는 로봇 SW\n2022. 8. 31. 08:00\n제목을 "ROS2 혼자 공부하기 좋은 책"이라고 잡으니 첫 문장부터 창피합니다. 최근 몇 개월간 작업한 ROS2 기초 책을 출판했습니다. ...'

2. 셀프 주유소가 정말 저렴할까? - 데이터 확보 작업

selenium으로 데이터 얻어오기

import requests
from selenium import webdriver

#페이지 접근
url = 'https://www.opinet.co.kr/searRgSelect.do'
driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get(url)
  • 문제
      1. 해당 url로 바로 접속 불가
      1. 메인페이지로 접속되고 팝업창이 나온다.
# 팝업창 화면 전환 후 닫아주기
driver.switch_to.window(driver.window_handles[-1])
driver.get(url)

import time 

# 페이지 접근
url = 'https://www.opinet.co.kr/searRgSelect.do'
driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get(url)
time.sleep(2)
#팝업 창
driver.switch_to.window(driver.window_handles[-1])
#팝업창 닫아주기
driver.close()
#메인화면 창으로 전환
driver.switch_to.window(driver.window_handles[-1])
# 접근 url 다시 요청
driver.get(url)
url = 'https://www.opinet.co.kr/searRgSelect.do'
driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get(url)
driver.get(url)
  • 지역 시/도 데이터
# 지역: 시/도
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By

sido_list_raw = driver.find_element(By.ID,"SIDO_NM0")
sido_list= sido_list_raw.find_elements(By.TAG_NAME,'option')
sido_list[17].text

-->'제주'

sido_list[1].get_attribute("value")  #속성 값 가져오기

--> '서울특별시'

sido_names = []

for option in sido_list:
    sido_names.append(option.get_attribute("value"))
sido_names

-->
['',
'서울특별시',
'부산광역시',
'대구광역시',
'인천광역시',
'광주광역시',
'대전광역시',
'울산광역시',
'세종특별자치시',
'경기도',
'강원도',
'충청북도',
'충청남도',
'전라북도',
'전라남도',
'경상북도',
'경상남도',
'제주특별자치도']

#한 줄로 쓰기 
sido_names = [option.get_attribute("value")for option in sido_list]
sido_names[:5]

--> ['', '서울특별시', '부산광역시', '대구광역시', '인천광역시']

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[:5]

--> ['강남구', '강동구', '강북구', '강서구', '관악구']

gu_list_raw.send_keys(gu_names[15])

# 엑셀 저장
driver.find_element(By.XPATH,'//*[@id="glopopd_excel"]/span').click()
# 다른방법 
# driver.find_element(By.CSS_SELECTOR,'#glopopd_excel > span').click()

# element_get_excel = driver.find_element(By.ID,'glopopd_excel')
# element_get_excel.click()

# for문으로 자동작업 설정 
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(3)
    
    element_get_excel = driver.find_element(By.XPATH,'//*[@id="glopopd_excel"]/span').click()
    time.sleep(2)
  • 엑셀 저장파일 확인
profile
데이터분석 스터디노트🧐✍️

0개의 댓글