Python 의 selenium 을 이용해서 스크롤 하기
크롤링 할 때 웹페이지를 스크롤 다운해야하는 경우가 있죠.
스크롤다운해서 끝까지 가야 그 다음 데이터를 조회하는 경우가 있고 그 외에도 필요한 경우가 있습니다.
방법 1. scrollTo
driver.execute_script("window.scrollTo(0, Y)")
여기서 Y 는 height 을 입력하면 됩니다.
페이지 끝까지 가려면 document.body.scrollHeight 를 사용합니다.
계속해서 스크롤 다운하면서 데이터를 다 조회할때는
SCROLL_PAUSE_SEC = 1
# 스크롤 높이 가져옴
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# 끝까지 스크롤 다운
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 1초 대기
time.sleep(SCROLL_PAUSE_SEC)
# 스크롤 다운 후 스크롤 높이 다시 가져옴
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
이 코드도 약간 문제가 있을 수 있는게, 로딩이 길게 걸릴땐 중간에 멈출수 있다는거죠.
이에대한 해결 방법은
1. SCROLL_PAUSE_SEC 을 늘리거나,
2. new_height 와 last_height 가 같을 때만 한번 더 sleep 하고 new_height 를 다시 가져와서 체크.
2번 방법이 나을듯합니다. 1번은 전체 크롤링 속도가 늦어질거니까요.
방법 2. ActionChains 의 move_to_element
이것은 특정한 element 를 알고 있을 때 그 위치까지 scroll 하게 됩니다.
예를들어
# ActionChains 를 사용하기 위해서.
from selenium.webdriver import ActionChains
# id가 something 인 element 를 찾음
some_tag = driver.find_element_by_id('something')
# somthing element 까지 스크롤
action = ActionChains(driver)
action.move_to_element(some_tag).perform()
코드에 'something' element를 찾았는지 체크를 하는게 좋겠습니다. if 문 하나 추가하시면 됩니다.
방법 3. 특정 시간동안 계속해서 scroll down 하기.
제가 사용하는 소스코드인데요.
아래와 같이 datetime 을 이용해서 정해진 초 동안 1초에 한번씩 스크롤 다운합니다.
이 방법은 무한로딩 데이터를 다 가져올 수 없으니 적당히 가져올때 사용합니다.
import datetime
def doScrollDown(whileSeconds):
start = datetime.datetime.now()
end = start + datetime.timedelta(seconds=whileSeconds)
while True:
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
time.sleep(1)
if datetime.datetime.now() > end:
break
예를들어 60초 동안 계속해서 스크롤 다운하려면 doScrollDown(60) 이렇게 쓰면 되겠네요.
1초에 한번씩 스크롤할 필요없으면 sleep 시간을 조정하면 됩니다.
크롤링 하려는 페이지에 특성에 맞게 scroll 하면서 데이터를 다 찾아내면 되겠습니다.
'Python' 카테고리의 다른 글
[Python] UUID, GUID 생성하기 (0) | 2020.07.05 |
---|---|
[Python] 특수문자 제거, HTML 태그 제거 (0) | 2020.06.25 |
[ChromeDriver] 크롬 드라이버 버전에 따라 설정하는 방법 (0) | 2020.06.09 |
[Python] gif 이미지 opencv 로 로드하기 cv2 (1) | 2020.05.18 |
[Centos7] Python3.7 설치 ( SCL 이용하는 방법 ) (0) | 2020.02.20 |
댓글