파이썬 셀레니움을 이용하면 웬만한 웹페이지에서의 업무들을 자동화시킬 수 있습니다. 반복된 시간에 메일 보내기, 뉴스기사 스크랩, 이미지 다운, 데이터 크롤링 등등. 이번 포스팅에서는 HTML요소 다루는 방법을 소개드리려고 합니다.
셀레니움 설치
파이썬 셀레니움을 이용하면 쉽고 유용하게 웹스크래핑을 터득할 수 있습니다. 가장 기초가 되는 것은 단연 HTML 요소 찾기 입니다. 요소를 찾을 수 있어야 클릭을 하거나, 값을 입력하거나, 속성정보를 추출하는게 가능해집니다. 파이썬에서 셀레니움을 이용하기 위해 선행되어야 할 것은 먼저 모듈을 설치해야 하고, 크롬 드라이버를 설치해야 합니다. 셀레니움 모듈을 아나콘다 prompt에서 설치하실 때 주의하셔야 할 부분이 있는데요. 파이썬 셀레니움 코드가 최신 버전에서는 요소 찾는 방법이 조금 더 번거롭게 변경되었습니다. 그래서 저는 항상 셀레니움을 설치할때 4.1.0 버전을 설치합니다. 만약 아래의 요소 찾는 방법으로 시도했는데 에러가 나온다면, 해당 버전을 지우고 4.1.0 버전으로 이용하시기를 권장드립니다.
pip install selenium==4.1.0
이전 포스팅에서 크롬드라이버 자동 업데이트와 관련된 내용을 소개드린적 있기 때문에, 이부분은 생략하고 넘어가도록 하겠습니다. 아직 이부분을 숙지하지 못하신 분들은 아래 링크를 참고해보시면 좋을 것 같습니다.
파이썬 크롬 드라이버 자동 업데이트
파이썬 셀레니움 모듈을 이용할 때 반드시 필요한 것이 크롬 드라이버 인데, 지속적으로 업데이트되는 크롬 버전에 맞춰 드라이버를 설치하는 것은 여간 번거로운 일이 아닙니다. 이번 포스팅
kirrgong.tistory.com
HTML 요소 찾기
먼저 파이썬 스크립트에서 셀레니움과 관련된 모듈들을 우선 로딩시키고 크롬 드라이버를 오픈해줘야 합니다. 또한 우리가 접속을 원하는 url 주소를 입력하고, driver를 해당 url로 이동해보겠습니다.
from selenium import webdriver
import chromedriver_autoinstaller
import os
chrome_ver = chromedriver_autoinstaller.get_chrome_version().split('.')[0]
driver_path = f"./{chrome_ver}/chromedriver.exe"
if os.path.exists(driver_path):
print(f"chrom driver is insatlled: {driver_path}")
else:
print(f"install the chrome driver(ver: {chrome_ver})")
chromedriver_autoinstaller.install(True)
driver = webdriver.Chrome(driver_path)
url = 'https://news.daum.net/'
driver.get(url)
위 코드를 구동하셨다면, 아마 다음 뉴스페이지가 크롬에서 열려있을 겁니다. 이제부터 셀레니움을 이용하여 HTML 요소를 찾아야 하는데, 저는 '경제' 탭에 해당하는 요소를 한번 찾아보겠습니다.
크롬에서 요소를 찾기 위해서는 개발자 도구를 열으셔서 찾아야 합니다. '경제'탭에 마우스 우클릭을 했을 때 '검사' 버튼을 눌러주시면 개발자 도구가 뜰겁니다. 이때 아래 그림과 같이 '01'로 표기된 박스를 클릭하고 '경제'탭으로 마우스를 이동하게 되면, 해당하는 요소 값에 블락 처리가 되는데 그게 '02'번 박스 입니다. 여기서 마우스 우클릭 후 '03'번 박스(copy)를 누르면 해당 요소의 정보를 원하는 형태로 복사할 수 있는데, 저는 XPath로 복사해보겠습니다.
셀레니움으로 요소 핸들링
이제 파이썬 스크립트로 다시 돌아와서 find_element 함수를 이용하여 xpath를 입력해보겠습니다.
driver.find_element_by_xpath('//*[@id="gnbContent"]/div/ul/li[4]/a/span')
Out[3]: <selenium.webdriver.remote.webelement.WebElement (session="a9dc3c3d33ed387fe5b2cc92d42543b5", element="6e48a7df-8fa5-44c8-a879-e5ddbd0ad51b")>
위에서 보시는 out과 같이 출력되셨다면 요소를 잘 찾은 겁니다. 여기서 주의해야 할 점은 우리가 복사한 xpath에 " " 큰 따옴표가 표기되어 있기 때문에 복사한 값을 반드시 ' '작은 따옴표로 묶어주어야 합니다. 또한 위의 코드를 직접 작성하신 분들은 느끼셨겠지만, driver.find_element 까지 입력하게 되면 엄청 다양한 방법으로 요소를 찾을 수 있습니다. Class Name, id, tag name, css selector 등등. 가장 직관적인 방법은 앞서 소개드린 XPath로 찾는 방법입니다.
위의 셀레니움 find 함수의 종류를 보시면 맨 아래 find_elements라는 함수가 있습니다. 웹스크래핑을 하시다보면, xpath도 같고, id 값, class name, tag도 모두 동일한 요소가 여러개 있는 경우가 종종 있습니다. 이때 여러개의 요소를 찾아 줄 수 있는 함수 입니다. 우리가 찾으려는 경제 탭이 4번째에 위치하는데, 이숫자를 지우고 모든 요소를 찾아보겠습니다.
아래와 같이 상위 탭인 '홈', '사회', ' 정치', '경제', '국제', '문화', 'IT', '연재', '포토', '팩트체크' 총 10개의 요소를 셀레니움에서 출력된 것을 확인할 수 있습니다.
driver.find_elements_by_xpath('//*[@id="gnbContent"]/div/ul/li/a/span')
Out[4]:
[<selenium.webdriver.remote.webelement.WebElement (session="a9dc3c3d33ed387fe5b2cc92d42543b5", element="b2201dde-2338-44b4-bae6-86d6c571b473")>,
<selenium.webdriver.remote.webelement.WebElement (session="a9dc3c3d33ed387fe5b2cc92d42543b5", element="bd9d8cda-372b-42c6-bd42-060415c76bb3")>,
<selenium.webdriver.remote.webelement.WebElement (session="a9dc3c3d33ed387fe5b2cc92d42543b5", element="04e3c996-d9ad-4188-b308-feded2fd2e5a")>,
<selenium.webdriver.remote.webelement.WebElement (session="a9dc3c3d33ed387fe5b2cc92d42543b5", element="6e48a7df-8fa5-44c8-a879-e5ddbd0ad51b")>,
<selenium.webdriver.remote.webelement.WebElement (session="a9dc3c3d33ed387fe5b2cc92d42543b5", element="a1bc1d15-843e-4ac3-8424-4b42bf49a2d0")>,
<selenium.webdriver.remote.webelement.WebElement (session="a9dc3c3d33ed387fe5b2cc92d42543b5", element="b07f5125-377d-477e-9e67-f4cde9b8cca4")>,
<selenium.webdriver.remote.webelement.WebElement (session="a9dc3c3d33ed387fe5b2cc92d42543b5", element="8e1f8fd7-c402-48b0-9664-f87e8eae5030")>,
<selenium.webdriver.remote.webelement.WebElement (session="a9dc3c3d33ed387fe5b2cc92d42543b5", element="7fd1d0e1-c0cf-4d46-a935-59a748037e9d")>,
<selenium.webdriver.remote.webelement.WebElement (session="a9dc3c3d33ed387fe5b2cc92d42543b5", element="18ca3ed3-8fc5-4f63-87d6-35a3697d1fbb")>,
<selenium.webdriver.remote.webelement.WebElement (session="a9dc3c3d33ed387fe5b2cc92d42543b5", element="8177f64b-a77c-4096-9913-b0a00eaefcc2")>]
'경제' 탭의 요소를 클릭할 때에는 해당 요소를 찾고 click()함수를 붙여 주면 간단히 클릭이 가능해집니다.
driver.find_element_by_xpath('//*[@id="gnbContent"]/div/ul/li[4]/a/span').click()
이처럼 사람이 직접 수행하는 일련의 과정을 셀레니움을 이용하여 코드로 작성하고 반복구문으로 걸어준다면, 자동화 업무가 간단히 완료될 수 있습니다. 셀레니움은 생각보다 배우기 쉽고, 활용도가 높기 때문에 익혀두시면 반드시 업무에 큰 도움이 되실 수 있을 것 같습니다.
댓글