본문 바로가기
기록/Python

[Python/Linux] 파이썬 selenium 활용하여 웹 페이지 버튼 클릭하기 & 리눅스에서 실행 삽질 기록

by 자임 2022. 6. 30.

 

첫번째 목표: 코드를 실행하면 웹페이지의 엑셀 다운로드 버튼을 눌러 엑셀이 다운로드 되게 한다.

 

개발자도구로 소스 확인 결과 웹페이지의 버튼을 클릭하는 동작을 해야지만 제대로 된 엑셀 파일을 다운로드 받을 수 있는 구조였음.
파이썬 라이브러리 찾아보다가 selenium 발견하고 적용해봤다.

참고한 블로그 :
https://tbbrother.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%85%80%EB%A6%AC%EB%8B%88%EC%97%84Selenium%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EC%9B%B9-%ED%81%B4%EB%A6%AD%ED%95%98%EA%B8%B0


 

from selenium import webdriver
import time


driver = webdriver.Chrome('chromedriver 경로')

driver.get('페이지 url')

driver.find_element_by_xpath('해당 버튼 xPath').click()

time.sleep(5)

#Chrome 종료
driver.close()

 

* xpath 찾는 법 : 개발자도구로 클릭 원하는 곳의 HTML로 이동 -> 오른쪽 마우스 눌러서 Copy > Copy XPath

 

 

 

 

 

첫번째 오류:
DeprecationWarning: executable_path has been deprecated, please pass in a Service object


해결 방법:
1. webdriver_manager 패키지 설치 후 임포트

from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager


2. 
Service(ChromeDriverManager().install()) 를 사용하여 크롬드라이버를 가져온다.
다운로드 받은 경로를 참조하는 게 아니라, 현재 OS에 설치된 크롬 브라우져를 사용하는 것으로 변경됨.


참고: 
https://velog.io/@sangyeon217/deprecation-warning-executablepath-has-been-deprecated

 

 

 

 

 


두번째 오류:
파이썬 AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'


해결 방법:

1. 임포트 from selenium.webdriver.common.by import By

2. 'find_element_by_xpath('해당 버튼 xPath')' -> find_element(By.XPATH, '해당 버튼 xPath')


참고:
https://goodthings4me.tistory.com/567


=> 두 오류 다 selenium이 업데이트 되면서 발생한 것 같다.

 

 

 

 

해결방법 적용 코드

import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time

def set_chrome_driver():
    options = webdriver.ChromeOptions()
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    return driver

driver = set_chrome_driver()

driver.get("페이지 URL") #Chrome 실행

#엑셀 다운로드
driver.find_element(By.XPATH, "버튼 XPath").click()

time.sleep(5)

driver.close() #Chrome 종료

 

=> 로컬에서 테스트 했을 때 제대로 동작하는 것을 확인.

 

 

 

 

 

 

 

 



두번째 목표: 리눅스 서버에서 구동할 수 있게 코드 수정

 


(1) 화면 안 띄우고 엑셀 다운로드 받을 수 있게 수정


1. 화면 안 띄우는 옵션 추가

options.add_argument("headless")

 

참고 : https://minimin2.tistory.com/118

=> 이렇게만 추가해주면 엑셀 다운이 안 됨.

 


2. 파일 다운로드 패스 지정

downloadPath = "다운로드 경로".format(os.getlogin())
params = {'behavior': 'allow', 'downloadPath': downloadPath}
driver.execute_cdp_cmd('Page.setDownloadBehavior', params)

 

참고 : https://ingus26.tistory.com/77


=> 엑셀 다운로드 성공

 

 

 

적용한 코드

import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
import os

def set_chrome_driver():
    options = webdriver.ChromeOptions()
    options.add_argument("headless")

    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    return driver

driver = set_chrome_driver()

# 다운로드 경로 지정
downloadPath = "C:\\Users\\user\\Downloads".format(os.getlogin())
params = {'behavior': 'allow', 'downloadPath': downloadPath}
driver.execute_cdp_cmd('Page.setDownloadBehavior', params)


driver.get("https://www.ntis.go.kr/rndgate/eg/un/ra/mng.do")


# 리스트 다운로드 클릭
driver.find_element(By.XPATH, "//*[@id='rndListArea']/div[1]/div[2]/a[3]").click()

time.sleep(5)

driver.close() #종료

 

 

 

 



(2) 리눅스에서 테스트

 


* 리눅스에 Chrome 및 selenium 설치 참조
https://passwd.tistory.com/entry/CentOS-Chrome-%EB%B0%8F-Selenium-%EC%84%A4%EC%B9%98?category=1203758?category=1203758

 

 

 


리눅스 테스트 오류: 

selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)



해결 방법: 옵션 추가

options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

 


참고: https://league-cat.tistory.com/278

 

 

 

 

 

최종 코드

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import os

# 크롬 옵션
options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(executable_path='~리눅스경로/chromedriver', options=options)

# 다운로드 경로 지정
downloadPath = "다운로드 경로".format(os.getlogin())
params = {'behavior': 'allow', 'downloadPath': downloadPath}
driver.execute_cdp_cmd('Page.setDownloadBehavior', params)

driver.get("페이지 url")

# 리스트 다운로드
driver.find_element(By.XPATH, "버튼 XPath").click()

time.sleep(10)

#종료
driver.close()

 

 

* 리눅스에서는 Service 사용하지 않고 크롬 드라이버 경로를 지정해줬을 때 성공했음

* 로컬에서는 오류가 없었는데 리눅스에서 돌릴 때는 'chrome_options=options' 으로 했을 때 오류가 났음. 
chrome_options=options -> options=options 수정

 

 

 

 

 

=> 리눅스 테스트까지 성공했고, 하루에 한 번 해당 코드를 돌려 엑셀을 다운받아줄 계획