코딩을 공부한지 어느덧 3달
파이썬 셀레니움을 통해서 홈페이지를 들어가서 로그인 하고 각종 셀렉트 혹은 클릭 하고 엑셀다운받고 등등
구글링을 통해 검색해보고 실습해보고 운동할때도 샤워할때도 이걸 저렇게 해볼까??
대부분 업무 자동화는 성공하였네요.
첫번째 코딩공부를 한 목적을 이루었네요.
주업무가 코딩이 아니여서 이놈들을 또 계속 사용 안하면 엇?? 이게 이거였는지 저거였는지 헷갈릴때도 있고
그땐 분명히 되었는데 왜 안되지 가물가물....잊기전에 한번 더 메모 하려고 합니다^^
셀레니움으로 하다가 동적페이지일때 혹은 마우스 클릭도 아니고 마우스 오버(마우스커서)를 했을때 메뉴가 나올때가 있습니다.
그럴땐 마우스를 자동으로 움직여서 거기에 가져다 놓고 그이후 find_element 를 통해 찾거나 하면 됩니다.
https://www.w3schools.com/cssref/tryit.php?filename=trycss_sel_hover_dropdown
자세한건 w3schools 사이트 가시면 예제도 있으니 참고하시고...
예전에는 마우스 오버하는효과를 많이 사용했지만 최근에는 보기 힘듭니다.
근데 셀레니움을 하기 위해선 분석을 하고 코드를 작성해야되니.
간단하게 마우스 자동화를 해봐야겠습니다.
자주 접하는 홈페이지 오피넷(우리동네 싼주유소)
주유하기전에 항상 접속해서 근처 저렴한 주유소를 검색해서 주유하러 가는 습관이 있어서...
https://www.opinet.co.kr/user/main/mainView.do
오피넷 홈페이지 접속하시면 w3schools를 통해 봤던 마우스 오버하는효과를 보실수가 있습니다.
마우스 자동화를 하려면 내가 보는 모니터에서 마우스 x축과 y축의 좌표를 알아야합니다.
쉽게 말해 x = 100 움직이고 y= 100 움직여놔라 라고 하면 거기에 마우스커서를 자동으로 움직이게 하는겁니다.
마우스 자동화를 하기위해
pyautogui
사용하기 위해선 라이브러리를 설치 해야겠지요
pip install pyautogui
그리고 앞서 말했던 x축과 y축을 어떻게 알아내는데?????? 라는 의문점이 생길겁니다.
마우스자동화를 위해서 x축 y축 좌표
방법도 간단합니다.
#라이브러리 불러오기
import pyautogui
pyautogui.mouseInfo()
이렇게 하면되는데........!!!!!!!
저는 오류가 뜹니다.
PS D:\code\python> & D:/python/python.exe d:/code/python/example/pyautogui.py
Traceback (most recent call last):
File "d:\code\python\example\pyautogui.py", line 2, in <module>
import pyautogui
^^^^^^^^^^^^^^^^^^^
AttributeError: partially initialized module 'pyautogui' has no attribute 'mouseInfo' (most likely due to a circular import)
AttributeError: partially initialized module 'pyautogui' has no attribute 'mouseInfo' (most likely due to a circular import)
문제해결
https://pypi.org/project/MouseInfo/
pip install mouseinfo
터미널에서 설치하고 난뒤 다음과 같이 변경해주면 되더군요
#라이브러리 불러오기
import mouseinfo
mouseinfo.mouseInfo()
솔직하게 이유는 모르겠습니다.
가끔 파이썬버전이 높아서 지원을 안하는 경우도 있거나 아님 라이브러리가 업데이트 되어서 실행 명령어가 변경되거나..
이제 실습을 하기위해서 오피넷 접속을 해봅니다.
좌표를 알아내기 위해서는 mouseinfo 0.1.3 창이 실행되고 있어야됩니다.
마우스 X축, Y축 좌표 획득해보기
좌표는 다음과 같이 획득 할 수 있습니다.
싼주유소 찾기위에 마우스 올리면 마우스 x,y값이 mouseinfo 0.1.3 를 통해서 나타 납니다. X = 416 , Y= 113
바로 아래 지역별 서브메뉴에 마우스 올리면 마우스 x,y값 동일하게 나타나네요 X = 381 , Y= 185
이제 코딩을 해볼까요
마우스 자동화를 할려면 라이브러리를 불러와서 입력해야되고 그것을 어떻게 사용하는지 알아야겠지요
pyautogui.moveTo(마우스X축값 , 마우스Y축값 , 마우스커서유지시간(초단위) )
pyautogui.moveTo(401 , 113 , 5) #(X축좌표, Y축좌표, second)
이렇게 사용하면 됩니다.
이제 라이브러리를 불러와서 코딩하시면됩니다.
#라이브러리 불러오기
import pyautogui
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
import time
#driver = webdriver.Chrome() # 현재파일과 동일한 경로일 경우 생략 가능
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.maximize_window()
baseurl = 'https://www.opinet.co.kr/user/main/mainView.do'
#사이트 이동(지역별)
driver.get(baseurl)
#지역별 옵션으로 가기위함 마우스자동화
pyautogui.moveTo(416, 113,5) #오피넷 싼 주유소 찾기 마우스 좌표로 이동
time.sleep(5)
pyautogui.moveTo(381, 185,5) #지역별로 이동
time.sleep(2)
pyautogui.click() #마우스자동화된곳 클릭
time.sleep(10) #페이지 이동 되었는지 대기시간을 10초
이렇게 작성하고 실행하면 됩니다. 실행~~
엇..문제가 생겼습니다.
우리가 일반적으로 크롬브라우저를 실행해서 알아봤던 좌표와 셀레니움을 실행했을때 브라우저는 조금 다릅니다.
셀레니움이용시 항상 나타나는 자동제어창
일반적인 셀레니움은 전혀 문제가 없습니다.
x축과 y축을 이용할때만 저 창으로 인해 밀려나버리니
x축은 큰 문제가 없는데 저 자동화제어 멘트로 인해 아래로 조금 내려와서 y축을 다시 알아봐야됩니다.ㅋㅋㅋㅋ
#지역별 옵션으로 가기위함 마우스자동화
pyautogui.moveTo(416, 146 , 5) #오피넷 싼 주유소 찾기 마우스 좌표로 이동
time.sleep(5)
pyautogui.moveTo(381, 216 , 5) #지역별로 이동
싼주유소메뉴와 지역별서브메뉴 약 y축 31만큰 더 가라 라고 해주면 되네요
지역별서브메뉴에서 pyautogui.click() 이렇게 클릭명령어를 줬기때문에 최종 클릭해서
페이지가 이동 되는것을 확인할 수 있습니다.
파이썬 셀레니움 셀렉트박스
지역별 페이지로 이동하면 다음과 같이 지역을 선택할수 있는 셀렉트박스를 확인 할 수 있습니다.
그럼 셀렉트박스를 내가 원하는 value값을 선택 할수 있게 라이브러리에
from selenium.webdriver.support.ui import Select
이렇게 추가 해줍니다.
홈페이지 셀렉트박스 와 value값이 어떻게 되어 있는지 분석해봅니다.
F12를 눌러서....
지역 셀렉트에 가장먼저 시/도를 선택할수 있게 우리가 선택하는건 서울,부산,대구 이런식인데
value값 서울특별시 부산광역시 대구광역시 이렇게 되어 있습니다.
그럼 value값을 특별시 광역시 다 넣어 줘야죠!
다음 셀렉트박스도 똑같이 value값 분석을...
시/군/구 value값을은 우리가 선택하는 텍스트와 같습니다.
#지역 시/도 선택 (지역별주유소 셀렉트박스#1)
dropdown = Select(driver.find_element(By.XPATH, '//*[@id="SIDO_NM0"]'))
dropdown.select_by_value("서울특별시")
time.sleep(2)
#지역 시/군/구 선택 (지역별주유소 셀렉트박스#2)
dropdown = Select(driver.find_element(By.XPATH, '//*[@id="SIGUNGU_NM0"]'))
dropdown.select_by_value("강남구")
time.sleep(2)
셀렉트 박스 첫번째 "서울특별시" 선택 하고 "강남구"를 선택해라!! (전 서울 몇번 안가봤습니다..ㅋㅋㅋ)
그리고 조회를 클릭 해야되는데 오피넷에서는 시/도 선택하고 시/군/구 까지 선택하면 자동 조회가 됩니다.
그래도 혹시 몰라서 조회 버튼 클릭 까지 만들어줍니다.
보통 해당 버튼이나 알아봐야되는곳에서 마우스 오른쪽 누르고 검사를 누르면 자동으로 f12 개발자 모드로 알수 있는데
크롬 개발자 도구 - 요소 검사 (Select an element in the page to inspect it)
오피넷과 같이 마우스 오른쪽 금지 사이트에서는 f12 누르고
크롬 개발자 도구 - 요소 검사 (Select an element in the page to inspect it) 로 알수 있습니다.
조회 까지 한 다음 최종 적으로 엑셀저장을 통해서 파일을 다운 받을수 있습니다.
아래 내리면 엑셀저장이라는 버튼이 있습니다.
역시 개발자도구 요소검사로 XPath를 복사 해옵니다.
Copy ▶ 메뉴 보면 많은 copy가 보입니다. 지금은 XPath
셀레니움이나 bs4(크롤링) 하려면 자주 사용합니다..
element가 뭔지 XPath가 뭔지는 따로 설명 안하겠습니다.
이런 이론까지 하면 코딩 흥미도 갑자기 떨어지기때문에... 그냥 저놈들을 이용해서 결과물부터...왜냐 재미있어야되니!!
최종정리 된 코드 입니다.
###########################################################################################################################
#오피넷(주유소) 사이트 접속해서 해당지역 최저가 엑셀다운로드
###########################################################################################################################
#라이브러리 불러오기
import pyautogui
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
import time
#driver 지정 없으면 자동설치
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.maximize_window()
#홈페이지주소
baseurl = 'https://www.opinet.co.kr/user/main/mainView.do'
#사이트 이동(지역별)
driver.get(baseurl)
#지역별 옵션으로 가기위함 마우스자동화
pyautogui.moveTo(416, 146,5) #오피넷 싼 주유소 찾기 마우스 좌표로 이동
time.sleep(5)
pyautogui.moveTo(381, 216,5) #지역별로 이동
time.sleep(2)
pyautogui.click() #마우스자동화된곳 클릭
time.sleep(3)
#지역 시/도 선택 (지역별주유소 셀렉트박스#1)
dropdown = Select(driver.find_element(By.XPATH, '//*[@id="SIDO_NM0"]'))
dropdown.select_by_value("서울특별시")
time.sleep(2)
#지역 시/군/구 선택 (지역별주유소 셀렉트박스#2)
dropdown = Select(driver.find_element(By.XPATH, '//*[@id="SIGUNGU_NM0"]'))
dropdown.select_by_value("강남구")
time.sleep(2)
#상단 지역별 선택 후 조회버튼클릭
driver.find_element(By.XPATH, '//*[@id="searRgSelect"]').click()
time.sleep(2)
#보통휘발유 선택 (기본값이라 생략가능)
driver.find_element(By.XPATH, '//*[@id="os_layer2"]/p/a').click()
time.sleep(2)
#엑셀파일 저장
driver.find_element(By.XPATH, '//*[@id="glopopd_excel"]').click()
time.sleep(5)
#브라우저 종료(닫기)
driver.quit()
'코딩(Coding)' 카테고리의 다른 글
간단한 배치파일 만들기 (2) | 2023.03.25 |
---|---|
코딩시 구글링 팁 및 첫 파이썬 오류해결(find_Element) (0) | 2022.12.16 |
코딩을 해보자!! (2) | 2022.12.15 |