CodeGym /자바 코스 /Python SELF KO /여러 페이지를 탐색하는 기본 접근법

여러 페이지를 탐색하는 기본 접근법

Python SELF KO
레벨 38 , 레슨 2
사용 가능

1. "다음" 버튼 사용하기

만약 웹사이트에 다음 페이지로 넘어가는 "다음" 버튼이나 링크가 있다면, 루프를 설정해서 버튼이 있는 동안 반복적으로 클릭할 수 있어!

코드 예제

Python

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
import time

def initialize_driver():
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    return driver

def open_page(driver, url):
    driver.get(url)

def collect_data(driver):
    # 현재 페이지에서 데이터 수집 예제
    items = driver.find_elements(By.CLASS_NAME, "item_class")
    for item in items:
        print(item.text)  # 여기서 데이터를 저장하거나 처리할 수 있음
    
def click_next_button(driver):
    try:
        next_button = driver.find_element(By.LINK_TEXT, "Next")
        next_button.click()
        return True
    except NoSuchElementException:
        return False  # 버튼을 찾을 수 없으면 마지막 페이지라는 뜻

def main():
    driver = initialize_driver()
    open_page(driver, "https://example.com/page1")

    try:
        while True:
            collect_data(driver)
            if not click_next_button(driver):
                break  # "Next" 버튼이 없으면 루프 종료
            time.sleep(2)  # 다음 페이지가 로드될 시간을 기다림
    finally:
        driver.quit()

main()

코드 설명

initialize_driver() — 드라이버 초기화.
open_page() — 작업 시작을 위해 첫 번째 페이지를 엶.
collect_data() — 현재 페이지에서 데이터를 수집하는 함수.
click_next_button()"Next" 버튼을 찾아 클릭하는 함수. 버튼이 없으면 False를 반환하며, 이는 탐색이 끝났음을 의미.
main() 안의 루프 — 페이지를 탐색하는 기본 루프. "Next" 버튼을 더 이상 찾을 수 없으면 작업을 종료.

2. 페이지 번호를 사용한 탐색

몇몇 웹사이트에서는 페이지 번호 링크(예: "1", "2", "3" 등)가 있는 경우가 있어. 이럴 때는 링크 목록을 모아 각 링크를 순서대로 탐색하면 돼.

코드 예제

Python

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

def initialize_driver():
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    return driver

def open_page(driver, url):
    driver.get(url)

def collect_data(driver):
    items = driver.find_elements(By.CLASS_NAME, "item_class")
    for item in items:
        print(item.text)

def go_to_page(driver, page_number):
    page_link = driver.find_element(By.LINK_TEXT, str(page_number))
    page_link.click()

def main():
    driver = initialize_driver()
    open_page(driver, "https://example.com/page1")

    try:
        total_pages = 5  # 페이지의 총 개수를 지정 (알고 있다면)
        for page in range(1, total_pages + 1):
            collect_data(driver)
            if page < total_pages:  # 마지막 페이지 이후로는 이동하지 않음
                go_to_page(driver, page + 1)
                time.sleep(2)  # 다음 페이지 로드를 위해 기다림
    finally:
        driver.quit()

main()

코드 설명

go_to_page() — 페이지 번호에 해당하는 링크를 찾아 해당 페이지로 이동.
main() 안의 루프total_pages 변수를 사용하여 페이지 개수를 정함. 루프는 마지막 페이지에 도달할 때까지 다음 페이지로 넘어감.

3. 각 페이지의 URL 수정

몇몇 사이트에서는 각 페이지가 URL 내 번호로 식별되는 간단한 URL 구조를 가지고 있어. 예를 들어, https://example.com/page/1, https://example.com/page/2 등. 이런 경우, URL을 변경해서 필요한 페이지를 로드하고 요소를 찾을 필요 없이 간단히 탐색할 수 있어.

코드 예제

Python

from selenium import webdriver
import time

def initialize_driver():
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    return driver

def open_page(driver, url):
    driver.get(url)

def collect_data(driver):
    items = driver.find_elements_by_class_name("item_class")
    for item in items:
        print(item.text)

def main():
    driver = initialize_driver()

    try:
        total_pages = 5  # 페이지의 총 개수를 지정 (알고 있다면)
        base_url = "https://example.com/page/"
        
        for page_number in range(1, total_pages + 1):
            url = f"{base_url}{page_number}"
            open_page(driver, url)
            collect_data(driver)
            time.sleep(2)  # 다음 페이지 로드를 위해 기다림
    finally:
        driver.quit()

main()

코드 설명

변수 base_url은 페이지의 기본 URL을 포함. 루프는 URL에 페이지 번호를 추가하고 차례로 각 페이지를 엶.
루프는 각 페이지의 URL을 생성하고 클릭 없이 데이터를 수집. 이는 오류 발생 가능성을 최소화.

4. 최적화 팁

  • 동적 요소 클릭 및 대기를 최소화: JavaScript로 로드되는 버튼 대신 URL과 링크를 사용하는 것이 더 안정적.
  • 최소한의 지연을 사용: 새로운 페이지로 이동할 때 time.sleep(2)처럼 짧은 지연을 사용하여 요소가 완전히 로드되도록 하지만 불필요하게 오래 기다리지 않도록 해야 함.
  • 전체 페이지 로드 후 데이터를 수집: 페이지의 모든 데이터가 완전히 로드되었는지 확인한 후 수집 시작. implicitly_wait를 사용하여 요소를 안정적으로 감지.
  • 로그 기록: 현재 페이지, 오류 및 성공적인 이동을 기록하는 로그를 사용해. 이는 스크립트 실행 중 문제를 진단하는 데 도움이 됨.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION