일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 가장인간적인미래
- 디지털자구행위
- 보복해킹
- cna
- 과학기술전문사관
- Los
- Selenium
- 해킹
- 윤송이
- webofscience
- 인공지능윤리
- blindSQL
- hackingback
- CVE
- LordOfSQLInjection
- 해킹백
- 사이버위협
- 윤리적해커
- CTF
- clarivate
- 웹취약점
- ACDC
- 밀리테크챌린지
- Today
- Total
프리미의 공간
selenium 사용 팁 본문
2021년 2학기동안 정보화본부의 IR센터에서 근로장학생으로 근무했는데, python의 selenium으로 웹 크롤링하는 역할을 맡아 프로그래밍을 수행했다. 여기서 배운 여러가지 경험 팁들이 있어 글로 남긴다.
크게 3가지를 꼽았는데, 특정 기술보다는 접근 방식에 대한 이야기를 주로 담았다.
1. jupyter notebook으로 개발 후 python script로 패포
우리가 selenium으로 접근해야 할 대상은 chrome, firefox와 같은 웹 브라우저이다. selenium의 특징은 웹 브라우저와 상호작용하며 직접 사람이 액션을 취하듯이 자동화할 수 있는 것이 장점이라고 생각한다. 하지만 파이썬 스크립트를 CLI 환경에서 실행하고 종료되면 브라우저에 추가적인 액션을 취할 수 없다.
jupyter notebook은 한 번 webdriver를 실행하고 나면 종료 전까지 코드를 수정하여 추가적인 명령을 줄 수 있기 때문에 jupyter notebook 환경에서 작업하는 것이 편리하다. 특히 디버깅할 때 비슷한 코드를 여러 번 반복하여 실행할 수 있고, 함수 리턴값도 바로바로 볼 수 있기 때문에 편리했다.
마치 처음 C언어를 배울 때, printf로 일일이 화면에 찍어가던 거에서 디버거를 배운 후 런타임 시에 변수 값을 확인할 수 있는 느낌이랄까?
물론 개발 완료 후에는 파이썬으로 convert한 후 실행하는 것이 실행하는 입장에서 편리하다. 아무래도 jupyter notebook을 열 수 없는 환경이나 서버 등 CLI 환경으로 배포해야 할 수도 있기 때문이다.
jupyter notebook에서 python script로 convert 명령어는 아래와 같다.
jupyter nbconvert --to script NOTEBOOK_NAME.ipynb
2. xpath 보다는 css selector가 유리
span, div, li 등 webelement를 선택하는 방법은 여러가지가 있는데, 본인은 이전까지 xpath를 많이 사용했다. 주로 아래와 같은 방법으로.
listBtn = driver.find_element(By.XPATH, '//*[@id="snSearchType"]/div[1]/app-search-row/div/div[1]')
xpath는 tag name이나 attribute 등을 자유롭게 지정할 수 있기 때문에 범용적으로 쓰이며, xpath 문법 하나로 많은 것을 할 수 있다는 장점 덕분에 많이 사용했었다. 하지만 xpath는 div[1]과 같은 element의 순서가 소스코드내에 하드코딩된다는 이유 때문에, 내가 원하는 webelement의 순서가 바뀌는 경우 오작동을 일으킨다.
css selector는 주로 해당 webelement의 id 값이나 class 값으로 식별하기 때문에, webelement의 순서가 바뀌거나 새로운 요소가 추가되어도 식별가능하다는 특징이 있다. 따라서 xpath 사용이 적절하지 않다면 css selector를 사용하는 것도 하나의 대안이 될 수 있다.
3. xpath, css selector는 개발자도구를 활용하자.
이 방법을 알기 전까지는 xpath나 css selector를 직접 타이핑했는데, 크롬 개발자도구를 통해 바로 알 수 있다는 사실을 경험적으로 알았다.. 누가 알려줬으면 좋았을걸 하는 마음에 이렇게 글을 남긴다.
원하는 element 우클릭 > 복사 > selector 복사 클릭 시 css selector가, XPath 복사 클릭 시 xpath 값이 복사된다. 해당 값을 사용하면 부족함없이 사용할 수 있을 것이다.
4. 반응형 웹을 위한 driver option 지정
반응형 웹의 경우 브라우저의 크기에 따라 나타나는 element가 다르다. (자세한 구현 원리는 아직 모르겠다..)
브라우저의 크기에 따라 webelement를 선택하는 경로가 달라질 수 있기 때문에, 일관된 브라우저 환경을 위해 본인은 아래와 같은 옵션을 항상 사용한다.
from selenium import webdriver
import os
options = webdriver.ChromeOptions()
# 창이 뜨지 않게 설정
# options.add_argument('headless')
# 창 크기 설정
options.add_argument('window-size=1920x1080')
options.add_argument("disable-gpu")
options.add_argument('--start-fullscreen')
# 현재 디렉토리에 파일 저장
options.add_experimental_option("prefs", {
"download.default_directory": os.getcwd(),
"download.prompt_for_download": False,
"download.directory_upgrade": True,
"safebrowsing.enabled": True
})
driver = webdriver.Chrome(options=options)
추가로, 파일 다운로드 시 기존 크롬 브라우저에 설정된 저장경로가 아니라 파이썬 소스코드가 위치한 경로에 다운로드 받을 수 있도록 다운로드 설정도 추가해주었다.
마치며..
이번 포스팅에서는 본인이 배운 여러가지 selenium 팁들에 대해 남겼다. 이로 인해 다른 개발자가 조금이라도 도움을 받았으면 하는 마음이다.
'Dev' 카테고리의 다른 글
인터넷 없는 환경에 파이썬 패키지 설치 (0) | 2024.04.09 |
---|---|
WSL vs. Virtual Machine 차이점 비교 (0) | 2022.06.02 |
docker 자주 쓰이는 명령어 모음 (0) | 2022.01.22 |