프로그래밍을 배운지 3개월이 되었습니다.
Python Selenium 관련 홈페이지로 이동하여 로그인 후 각종 종류 선택 또는 클릭, 엑셀 다운로드 등
구글 검색, 운동, 운동 or 샤워, 이걸 해야 하나 저것을 해야 하나?
대부분의 작업 자동화는 성공적이었습니다.
첫 코딩 공부의 목적을 달성했습니다.
당신의 주된 직업이 코딩이 아니기 때문에 이 사람들을 사용하지 않는다면 어떻게 될까요? 이게 저것인지 헷갈릴 때가 있다.
그때 분명해졌지만 왜 안 될까요?
Selenium을 사용할 때 페이지가 동적이거나 마우스를 클릭하는 대신 마우스를 위에(마우스 포인터) 올려 놓을 때 메뉴가 표시되는 경우가 있습니다.
이 경우 자동으로 마우스를 이동하고 배치한 다음 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축 좌표를 알아야 합니다.
간단히 말해서 move x = 100이고 move 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: 부분적으로 초기화된 모듈 ‘pyautogui’에 ‘mouseInfo’ 속성이 없습니다(대부분 순환 가져오기 때문일 가능성이 높음).
문제를 해결하다
https://pypi.org/project/MouseInfo/
pip install mouseinfo
터미널에 설치되면 다음과 같이 변경할 수 있습니다.
#라이브러리 불러오기
import mouseinfo
mouseinfo.mouseInfo()
솔직히 이유를 모르겠습니다.
가끔 파이썬 버전이 높아서 지원하지 않거나, 라이브러리를 업데이트하고 실행 명령어를 바꾸는 경우가 있습니다.
이제 오피넷에 접속하여 실습해 봅시다.
좌표를 얻으려면 윈도우 mouseinfo 0.1.3이 실행 중이어야 합니다.
저렴한 주유소 찾기에 마우스를 올리면 mouseinfo 0.1.3 위에 마우스의 x,y 값이 표시됩니다.
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초
이렇게 작성하고 실행하면 됩니다.
달려라~~
이런… 문제가 있습니다.
우리가 보통 크롬 브라우저를 실행해서 알아내는 좌표와 Selenium을 실행할 때의 브라우저는 약간 다릅니다.
Selenium 사용시 항상 나타나는 자동제어창
일반 셀레늄은 전혀 문제가 없습니다.
x축과 y축을 사용할 때만 이 창 밖으로 밀려납니다.
x축은 큰 문제가 없지만 자동화 제어에 대한 이 댓글로 인해 조금 내려가서 y축을 다시 살펴봐야 합니다.
#지역별 옵션으로 가기위함 마우스자동화
pyautogui.moveTo(416, 146 , 5) #오피넷 싼 주유소 찾기 마우스 좌표로 이동
time.sleep(5)
pyautogui.moveTo(381, 216 , 5) #지역별로 이동
저렴한 주유소 메뉴와 지역별 하위 메뉴가 y축에 약 310,000개 있습니다.
지역 하위 메뉴에서 pyautogui.click()은 다음과 같은 클릭 명령을 내렸습니다.
페이지가 이동하는 것을 볼 수 있습니다.
Python 셀레늄 확인란
지역 페이지로 이동하면 다음과 같이 지역을 선택할 수 있는 선택 상자가 나타납니다.
그런 다음 원하는 값을 선택할 수 있도록 선택 상자를 라이브러리에 넣습니다.
from selenium.webdriver.support.ui import Select
그것을 추가하십시오.
홈 페이지 선택 상자와 값이 어떻게 생겼는지 분석해 봅시다.
F12로…
서울, 부산, 대구를 선택하여 지역 선택기에서 시/도를 먼저 선택하도록 하겠습니다.
가치 가치 서울광역시 부산광역시 대구광역시 이렇습니다.
그런 다음 특수 도시 및 대도시의 모든 값을 입력해야 합니다!
다음 선택 상자도 같은 방식으로 값을 분석합니다…
city/county/city 값은 선택한 텍스트와 동일합니다.
#지역 시/도 선택 (지역별주유소 셀렉트박스#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 개발자 모드를 찾을 수 있습니다.
Chrome 개발자 도구 – 페이지에서 검사할 요소를 선택합니다.
Opinet과 같은 금지된 웹 사이트를 마우스 오른쪽 버튼으로 클릭하고 F12를 누릅니다.
Chrome 개발자 도구 – 페이지에서 요소를 선택하여 검사합니다.
검색 후 최종적으로 Excel을 통해 파일을 저장할 수 있습니다.
하단에는 Excel 저장이라는 버튼이 있습니다.
또한 개발자 도구 요소 검사기로 XPath를 복사하십시오.
복사 메뉴를 보시면 복사가 많이 보입니다.
이제 XPath
셀레늄 또는 bs4(크롤링)에 자주 사용됩니다.
요소가 무엇인지, 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()