첫번째 목표: 코드를 실행하면 웹페이지의 엑셀 다운로드 버튼을 눌러 엑셀이 다운로드 되게 한다.
개발자도구로 소스 확인 결과 웹페이지의 버튼을 클릭하는 동작을 해야지만 제대로 된 엑셀 파일을 다운로드 받을 수 있는 구조였음.
파이썬 라이브러리 찾아보다가 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 수정
=> 리눅스 테스트까지 성공했고, 하루에 한 번 해당 코드를 돌려 엑셀을 다운받아줄 계획
'기록 > Python' 카테고리의 다른 글
[Python] 파이썬 데이터프레임(엑셀 데이터) MySQL에 저장하기 (1) | 2022.07.13 |
---|---|
[Python/Flask] 파이썬 flask 활용한 API 개발 기록 (0) | 2022.07.11 |
[Python] 파이썬 데이터프레임 NaN 값 들어있는 행 지우기 (0) | 2022.06.30 |
[Python] 파이썬 데이터프레임 오류 ValueError: Length of values (10) does not match length of index (25) (0) | 2022.06.29 |
[Python] 파이썬 ValueError: range() arg 3 must not be zero (0) | 2022.06.28 |