프로그래밍 실습/Python

파이썬 셀레니움 크롤링 (4) : while문을 이용하여 스크롤 끝까지 내리기

봄 비 2023. 6. 7. 13:28

python의 selenium을 이용하여 웹 페이지의 이미지를 크롤링하는 방법 4편입니다.

 

 

파이썬 셀레니움 크롤링 (3) : 네이버에서 이미지 검색하기

python의 selenium을 이용하여 웹 페이지의 이미지를 크롤링하는 방법 3편입니다. 파이썬 셀레니움 크롤링 (2) : 크롬 브라우저 열기 python의 selenium을 이용하여 웹 페이지의 이미지를 크롤링하는 방법

bom-b.tistory.com

 

이미지를 검색하고 이미지가 다 로드 될 수 있도록 페이지 끝까지 스크롤 하는 코드를 작성해보겠습니다.

 


- while문에 대해서 알아보기

 

스크롤을 끝까지 내리는 코드를 만들기 전에 while문에 대해서 알아보겠습니다.

while문은 주어진 조건이 참(True)인 동안 반복해서 코드를 실행합니다.

아래는 while문의 기본 구조입니다.

 

while 조건:
    코드 실행

 

while문에서 '조건'은 반복이 계속되는 동안 평가되는 Boolean식입니다. 

조건이 참(True)인 경우, 코드블럭이 실행되고 다시 조건을 확인합니다.

조건이 거짓이 되면 while문을 빠져나가고 다음 코드로 진행합니다.

아래는 1부터 5까지 출력하는 while문의 예시입니다.

 

count = 1
while count <= 5:
    print(count)
    count += 1

 

조건에 'count <= 5:'가 있으므로 count변수가 1부터 5이하인 경우 반복해서 코드를 실행합니다.

코드는 count변수의 값을 출력하고 count변수를 1씩 증가시킵니다.

count변수가 5를 초과할 경우 해당 while문을 빠져나가고 다음 코드를 진행합니다.

 

 

- while문과 for문의 차이점

 

while문과 for문은 서로 대체 가능한 경우가 많습니다.

일반적으로 for문은 반복횟수가 정해져 있는 경우에 더 적합하고

while문은 반복 횟수가 동적으로 변하는 경우에 유용하다고 볼 수 있습니다.

while문은 특정 조건이 충족될 때까지 반복해야 할 때 유용하게 사용할 수 있습니다.

 


- 이제 while문을 통해 스크롤을 끝까지 내리는 코드를 작성해보겠습니다.

 

import time

#끝까지 스크롤 내리기
while True:
    # 현재 화면의 높이 저장
    last_height = driver.execute_script("return document.body.scrollHeight")

    # 스크롤을 끝까지 내리는 JavaScript 실행
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # 스크롤 동작 후 로딩 대기
    time.sleep(2)

    # 새로운 높이 계산
    new_height = driver.execute_script("return document.body.scrollHeight")

    # 더 이상 스크롤이 되지 않으면 반복 종료
    if new_height == last_height:
        break

한줄씩 해석해보겠습니다.

 

while True:

while문의 조건이 True입니다.

while문은 조건이 참(True)인 경우 반복해서 코드블럭을 실행합니다.

따라서 이 while문은 아래에 어떤 코드가 올지와 상관없이 루프 내의 코드를 계속해서 실행합니다.

 

last_height = driver.execute_script("return document.body.scrollHeight")

'last_height'라는 변수에 값을 할당해줍니다.

'driver' 객체의 'excute_script' 매서드를 사용하여 JavaScript 코드를 실행합니다.

'driver'는 전에 driver = webdriver.Chrome(options=chrome_options)로 설정했습니다.

'document.body.scrollHeigh't는 현재 문서의 전체 스크롤 높이를 가져오는 JavaScript 코드입니다.

그리고 'return' 키워드는 JavaScript 코드에서 값을 Python으로 전달하는 역할을 수행합니다.

이를 통해 JavaScript와 Python간의 데이터 교환을 할 수 있습니다.

 

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

마찬가지로 'driver' 객체의 'excute_script' 매서드를 사용하여 JavaScript 코드를 실행합니다.

'window.scrollTo()' 매서드는 X축과 Y축으로 스크롤 위치를 지정할 수 있습니다.

여기서 X축을 0으로, Y축을 현재 문서의 전체 스크롤 높이로 지정하여 페이지를 맨 아래로 스크롤 합니다.

 

time.sleep(2)

2초 동안 코드 실행을 지연 시킵니다.

스크롤 이후에 대기하여 코드의 안정성을 높입니다.

 

new_height = driver.execute_script("return document.body.scrollHeight")

전에 'last_height'에 할당해 주었던 '현재 문서의 전체 스크롤 높이'를 이번엔 'new_height'변수에 할당시킵니다.

이 값은 한번 스크롤을 한 후의 현재 문서의 전체 스크롤 높이값이 되겠습니다.

 

if new_height == last_height:
        break

만약  'new_height'와 'last_height'의 값이 동일하다면

더 이상 스크롤을 할 수 없으므로 

'break'를 통해 무한 루프를 탈출합니다.