제로베이스 스쿨 _ EDA/웹 크롤링/파이썬 프로그래밍_05. 유가 분석

수야·2023년 7월 9일
0

#Beautiful Soup 만으로 해결할 수 없는 것

접근할 웹 주소를 알 수 없을때
자바스크립트를 사용하는 웹페이지의 경우
웹브라우저로 접근하지 않으면 안될 때

Selenum을 사용하면 됨
웹 브라우저를 원격 조작하는 도구
자동으로 url을 열고 클릭 등 가능
스크롤, 문자 입력, 화면 캡쳐 등등 가능

셀레니윰 사용을 위해서는
파이썬 모듈도 설치하고, 크롬 드라이버도 받아야함

#셀레니윰 설치 at prompt
#conda install selenium

셀레니움 기초

셀레니움을 이용해 처음으로 접근해보기

from selenium import webdriver 

웹 브라우저와 상호작용하여 웹 애플리케이션을 테스트하거나 자동화하는 데 사용
웹 브라우저 제어: WebDriver를 사용하여 웹 브라우저를 자동으로 열고 닫을 수 있으며, 웹 페이지를 탐색하고 조작할 수 있습니다.
웹 요소 검색: WebDriver는 웹 페이지에서 특정 요소를 검색하는 기능을 제공합니다. 요소를 ID, 클래스, XPath 등을 사용하여 찾을 수 있습니다.
요소 조작: WebDriver를 사용하여 웹 요소를 클릭하거나 값을 입력하는 등의 작업을 수행할 수 있습니다.
액션 수행: WebDriver는 마우스 클릭, 키보드 입력 등과 같은 다양한 동작을 수행할 수 있습니다.
페이지 로딩 대기: WebDriver는 웹 페이지의 로딩이 완료될 때까지 기다리는 기능을 제공합니다. 이를 통해 웹 페이지가 완전히 로드된 후에 작업을 수행할 수 있습니다.

#크롬 드라이버 실행
# webdriver.Chrome 명령으로 크롬 드라이버의 경로 지정
# get 명령으로 접근하고 싶은 주소 지정
driver = webdriver.Chrome('../driver/chromedriver')
driver.get('https://pinkwink.kr')
# 새로운 크롬이 나타나면서 지정된 웹 주소에 접근함
# 화면 최대 크기로 설정
driver.maximize_window()
# 화면 최소 크기로 설정
driver.minimize_window()
# 화면 크기 설정
driver.set_window_size(500,600)
# 새로고침
driver.refresh()
# 뒤로 가기
driver.back()
# 앞으로 가기
driver.forward()
# 새로운 탭 생성하기
driver.execute_script('window.open('원하는 주소 입력')')
# 탭 이동 0부터 시작
driver.switch_to.window(driver.window_handles[1])
# 탭 개수 확인
len(driver.window_handles)
# 탭 닫기, 탭 설정해서 닫기는 안되고, 현재 열려있는 탭 닫기
driver.close()
# 전체 종료
driver.quit()
driver.close()
# 스크롤 가능한 높이 가져오기
scroll_height = driver.execute_script('return document.body.scrollHeight') #  JavaScript에서 DOM(Document Object Model)을 통해 현재 문서의 전체 높이를 나타내는 속성
scroll_height
# 화면스크롤, 화면의 제일 아래로 내려감
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
# 화면 최상단으로 스크롤
driver.execute_script('window.scroll(0,0);')
# 현재 보이는 화면 스크린샷 저장, 
driver.save_screenshot('./testScreenshot.png')
driver.save_screenshot('./testScreenshot.png')

from selenium.webdriver import ActionChains

# xpath로 찾아서 스크롤하기
scroll_to = driver.find_element_by_xpath('''//*[@id="content"]/div[8]/div/ul/li[2]/a/figure/img''') #xpath 찍을때 ''' 로 묶고 넣어주기

scroll_action = ActionChains(driver)
scroll_action.move_to_element(scroll_to).perform()
# 입력창에 글자 넣기
search_at= driver.find_element_by_id('''header''') #id로 찾기(id는 오직 하나니까)
search_at.send_keys('data science')
# 버튼 누르기(xpath로)
xpath = '''//*[@id="header"]/div[2]/button'''
# // : 최상위 태그
# * : 자손 태그
# / : 자식 태그
search_button = driver.find_element_by_xpath(xpath).click()
# 현재 화면의 html가져오기(beautifulsoup사용하기 위해)

from bs4 import BeautifulSoup

req = driver.page_source
soup = BeautifulSoup(req, 'html.parser')

contetnt = soup.select('.inner')
len(contetnt)
contetnt[0]
#비활성화되어있는 검색 버튼 활성화 하기
test_button = driver.find_element_by_xpath(xpath)
action = ActionChains(driver)
action.move_to_element(test_button).click().perform()
#검색어 넣기
search_at= driver.find_element_by_xpath('''//*[@id="header"]/div[2]/input''') #id로 찾기(id는 오직 하나니까)
search_at.send_keys('data science')
#검색 하기
search_button = driver.find_element_by_xpath(xpath).click()

서울 셀프 주유소 가격 비교해보기

지역 바꿀 때 마다 url바뀌고,
html로 정보 가져오는것도 어려워보임
즉, Beautiful Soup으로 바로 접근하기 어려워보임
따라서, 서울시 주유소를 대상으로 셀프 주유소가 저렴한지 확인하는게 목표이며
서울시 등록된 전체 주유 가격을 확인해야함

selenium으로 크롬 드라이버를 이용해 원하는 웹주소러로 접근

from selenium import webdriver

driver = webdriver.Chrome('../driver/chromedriver')
driver.get('https://www.opinet.co.kr/searRgSelect.do')
# 광역시도를 선택하는 곳부터 도전!

xpath = '//*[@id="SIGUNGU_NM0"]'
id = 'SIGUNGU_NM0'

#그러나, 기대한 결과가 아님 ㅠ 세부 내용까지 가져와야함 그래서
location_list_raw = driver.find_element_by_id(id)
location_list_raw

# 그래서 그 세부 내용의 옵션을 가져왔지만, 한글이 안보임
location_list = location_list_raw.find_elements_by_tag_name('option')
location_list

# 세부 내용 솔팅 해서 가져옴
location_name = [location.get_attribute('value') for location in location_list]
location_name.remove("")
location_name

#조회를 하였는데.. 바꾸는방법은? key값으로 해결!

location_list_raw.send_keys(location_name[1])
excel_id = 'glopopd_excel'
get_excel = driver.find_element_by_id(excel_id).click()
import time 
from tqdm import tqdm_notebook
for location in tqdm_notebook(location_name): #tqdm_notebook은 Jupyter Notebook에서 진행 상태를 시각적으로 표시하는 데 사용되는 라이브러리
    element = driver.find_element_by_id(id)
    element.send_keys(location)
    time.sleep(3) #time.sleep(3)을 사용하여 3초 동안 대기합니다. 이는 각 입력 후에 일시적인 지연을 추가하는 것으로, 웹 페이지의 로딩이나 다른 동작을 기다리기 위해 사용

    element.get_excel = driver.find_element_by_id(excel_id)
    time.sleep(3)
profile
수야는 코린이에서 더 나아갈거야

0개의 댓글