1. "다음" 버튼 사용하기
만약 웹사이트에 다음 페이지로 넘어가는 "다음" 버튼이나 링크가 있다면, 루프를 설정해서 버튼이 있는 동안 반복적으로 클릭할 수 있어!
코드 예제
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" 등)가 있는 경우가 있어. 이럴 때는 링크 목록을 모아 각 링크를 순서대로 탐색하면 돼.
코드 예제
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을 변경해서 필요한 페이지를 로드하고 요소를 찾을 필요 없이 간단히 탐색할 수 있어.
코드 예제
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
를 사용하여 요소를 안정적으로 감지. - 로그 기록: 현재 페이지, 오류 및 성공적인 이동을 기록하는 로그를 사용해. 이는 스크립트 실행 중 문제를 진단하는 데 도움이 됨.
GO TO FULL VERSION