CDW (Coding Discussion World)
python(selenium) - 크롤링 기본 사용법 본문
python selenium을 활용한 크롤링에 대해서 알아보고자 한다.
크롤링은 다들 많이 들어봤을거라고 생각한다. 크롬 등 웹에서 반복적으로 수행하는 일을 자동화 할수도 있고, 특정 게시글의 제목을 다 추출한다던가, 그림을 추출한다던가 응용하면 웹에서 반복적으로 수행해야 하는 일들을 자동화하기에 좋다. (이전 글중에 appium 을 통한 스마트폰 자동화랑 비슷하다)
우선 selenuim을 설치해보자. 이번편은 기본에 대해서 배울 것이므로 특별한 버전 없이 설치해도 무방하다.
(신규 버전부터는 find_element_by_css_selector 등 기본적인 내용이 많이 바뀌었다. pip list로 selenium 버전이 4 이상이라면 3버전으로 설치하는것이 좋다 또는 pip list --outdated)
pip install selenium
그다음에 해야 할일은 크롬 웹드라이버를 설치하는 것이다. 크롬 드라이버는 구굴에 '크롬 드라이버' 라고 검색해도 되고 아래 페이지를 참고해서 다운 받아도 된다.
https://chromedriver.chromium.org/downloads
ChromeDriver - WebDriver for Chrome - Downloads
Current Releases If you are using Chrome version 109, please download ChromeDriver 109.0.5414.74 If you are using Chrome version 108, please download ChromeDriver 108.0.5359.71 If you are using Chrome version 107, please download ChromeDriver 107.0.5304.62
chromedriver.chromium.org
페이지에 접속하면 여러가지 버전이 있는데 현재 내 PC에 설치된 크롬 드라이버 버전과 같아야 제대로 동작한다.
버전 확인 방법은 크롬 > 설정 > Chrome 정보에 가면 알 수 있다.
이때 크롭 버전이 자동으로 업데이트 될 수 있으니, 자동 버전 업데이트를 꺼두어도 좋다. (이전 글을 참고하자)
2023.01.13 - [기타] - 구글 크롬 드라이버 자동 업데이트 금지
구글 크롬 드라이버 자동 업데이트 금지
구글 크롬 드라이버가 자동 업데이트 되면 신규 기능에 의한 버그가 발생할 수도 있고, 기존에 사용하던 크롬 드라이버랑 호환이 안맞는 프로그램이 생길수도 있다. 이에 크롬 드라이버 자동 업
pymin.tistory.com
다음으로 다운로드 받은 크롬 드라이버를 파이썬을 실행시킬 폴더 위치에 옮겨주면 된다.
이제 selenium을 통해서 크롬 드라이버를 실행시키고, 기본 기능에 대해 하나하나 알아보자.
1. 원하는 주소로 접속
webdriver.Chrome 을 통해서 크롬 드라이버를 시작하고, get을 통해서 원하는 페이지로 이동할 수 있다.
from selenium import webdriver
import time
options = webdriver.ChromeOptions()
driver = webdriver.Chrome('chromedriver.exe', options=options)
driver.get('https://www.google.co.kr')
time.sleep(10)
이번에는 url 주소를 url이라는 변수에 담고 실행해보자. (이번엔 네이버로 했으며 형태는 동일하다)
from selenium import webdriver
import time
options = webdriver.ChromeOptions()
url = 'https://www.naver.co.kr'
driver = webdriver.Chrome('chromedriver.exe', options=options)
driver.get(url)
time.sleep(10)
2. 원하는 창 크기 설정
options를 설정하면 크롬 드라이버를 통해서 띄워지는 창의 옵션을 원하는 대로 선택이 가능하다.
### 창 크기 등 각종 옵션
options = webdriver.ChromeOptions()
# options.add_argument('window-size=1920,1080')
# options.add_argument('headless')
# options.add_argument('start-maximized')
3. 새탭 열기
새 탭을 열고 싶다면 driver.execute_script 을 사용하면 된다.
from selenium import webdriver
import time
options = webdriver.ChromeOptions()
options.add_argument('start-maximized')
url = 'https://www.naver.co.kr'
driver = webdriver.Chrome('chromedriver.exe', options=options)
driver.get(url)
driver.execute_script('window.open("https://google.co.kr");') #새 탭 열기
time.sleep(10)
4. 데이터 접근 방법
특정 데이터에 접근하기 위해서는 여러 가지 방법이 있다. 나중에 예제에서 다루겠지만 크롬 F12를 눌러서 html 을 확인해가면서 다루어보면 좋다.
driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]') #xpath 로 접근
driver.find_element_by_class_name('ico_search_submit') #class 속성으로 접근
driver.find_element_by_id('ke_kbd_btn') #id 속성으로 접근
driver.find_element_by_link_text('회원가입') #링크가 달려 있는 텍스트로 접근
driver.find_element_by_css_selector('#account > div > a') #css 셀렉터로 접근
driver.find_element_by_name('join') #name 속성으로 접근
driver.find_element_by_partial_link_text('가입') #링크가 달려 있는 엘레먼트에 텍스트 일부만 적어서 해당 엘레먼트에 접근
driver.find_element_by_tag_name('input') #태그 이름으로 접근
driver.find_element_by_tag_name('input').find_element_by_tag_name('a') #input 태그 하위태그인 a 태그에 접근
driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]').find_element_by_name('join') #xpath 로 접근한 엘레먼트의 안에 join 이라는 속성을 가진 tag 엘레먼트에 접근
5. 엘리먼트 클릭 방법
###엘레먼트 클릭
driver.find_element_by_id('ke_kbd_btn').click()
driver.find_element_by_css_selector('gLFyf.gsfi').click()
6. 텍스트 입력과 삭제
###텍스트 입력
driver.find_element_by_id('ke_awd2_btn').send_keys('텍스트 입력')
driver.find_element_by_css_selector('gLFyf.gsfi').send_keys('min')
##텍스트 삭제
driver.find_element_by_id('ke_awd2_btn').clear()
7. 단축키 입력 및 컨트롤 + v
from selenium.webdriver.common.keys import Keys
##단축키 입력
from selenium.webdriver.common.keys import Keys
## 컨트롤+V
driver.find_element_by_id('ke_kbd_btn').send_keys(Keys.CONTROL + 'v')
8. 경고창
##경고창 이동
driver.switch_to.alert
##경고창 수락 / 거절
from selenium.webdriver.common.alert import Alert
Alert(driver).accept() #경고창 수락 누름
Alert(driver).dismiss() #경고창 거절 누름
print(Alert(driver).text # 경고창 텍스트 얻음
9. 스크롤 이동 및 클릭
##스크롤 이동
브라우저 스크롤 최하단으로 이동
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
## CSS 셀렉터로 클릭
driver.execute_script("document.querySelector('body > div.modal-options__buttons > button.btn.btn-primary').click();")
10. 스크롤을 특정 엘리먼트로 이동
## 스크롤 특정 엘리먼트로 이동
element = driver.find_element_by_css_selector('div > a')
driver.execute_script('arguments[0].scrollIntoView(true);', element)
11. 브라우저 뒤로가기/앞으로가기
## 브라우저 뒤로가기, 앞으로가기
driver.back() #뒤로가기
driver.forward() #앞으로가기
12. 크롬 탬 간 이동
## 텝 이동
driver.window_handles[0] #브라우저 탭 객체를 리스트로 반환. [0] 은 인덱싱. 첫번재 탭을 의미
driver.switch_to.window(driver.window_handles[0]) #첫번째 탭으로 이동
driver.switch_to.window(driver.window_handles[1]) #두번째 탭으로 이동
driver.switch_to.window(driver.window_handles[2]) #세번째 탭으로 이동
13. 종료
## 종료
driver.close() #현재 탭 닫기
driver.quit() #브라우저 닫기
이상으로 간단한 기본 동작에 대해 확인해 보았으며, 추후에 추가할만한 내용이 있다면 추가하도록 하겠다.
'Python > Do something' 카테고리의 다른 글
python(selenium) - 대표 포털 사이트(네이버,구글,daum,zum,bing) 자동 검색하기 (0) | 2023.01.15 |
---|---|
python - random을 활용해서 load 분배, 원하는 비율만큼 함수 실행 (0) | 2023.01.15 |
python(requests) - kakao api를 통해 data 받아와서 db에 저장하기 (3) (1) | 2023.01.08 |
python(requests) - kakao api를 통해 data 받아와서 db에 저장하기 (2) (0) | 2023.01.08 |
python(requests) - kakao api를 통해 data 받아와서 db에 저장하기 (1) (0) | 2023.01.08 |