교보문고 웹사이트의 종합 주간 베스트를 웹크롤링하여 책이름과 저자를 출력하는 파이썬 예제 코드입니다.
클로드 코드를 사용하여 생성했습니다.
2025. 11. 16 최초작성
보통 웹페이지를 웹크롤링시 BeautifulSoup를 사용하지만 교보문고 웹페이지는 자바스크립트를 실행해야 책 목록을 가져올 수 있어서
Selenium를 사용해야 합니다. BeautifulSoup를는 html을 가져오지 자바스크립트를 실행할 수 없기 때문입니다.
파이썬 개발 환경을 만드는 방법은 다음 포스트를 참고하세요.
Visual Studio Code와 Miniconda를 사용한 Python 개발 환경 만들기( Windows, Ubuntu, WSL2)
https://webnautes00.blogspot.com/2025/12/visual-studio-code-miniconda-python.html
전체 코드입니다.
실행하기 위해선 다음 패키지를 설치해야 합니다.
pip install selenium webdriver-manager
""" 교보문고 베스트셀러 크롤러 (Selenium 버전) 동적 페이지 로딩을 위해 Selenium을 사용합니다. """
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import time import csv
def crawl_kyobo_bestseller_selenium(): """Selenium을 사용한 교보문고 베스트셀러 크롤링""" url = "https://store.kyobobook.co.kr/bestseller/total/weekly"
# Chrome 옵션 설정 chrome_options = Options() chrome_options.add_argument('--headless=new') # 새로운 headless 모드 chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--window-size=1920,1080') chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36') chrome_options.add_argument('--disable-blink-features=AutomationControlled') chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) chrome_options.add_experimental_option('useAutomationExtension', False)
driver = None books = []
try: # Chrome 드라이버 시작 (자동 설치) service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=chrome_options) driver.get(url)
# 페이지 로딩 대기 - 실제 책 컨테이너가 로드될 때까지 기다림 print("페이지 로딩 중...") try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "div.ml-4.w-full")) ) print("페이지 로딩 완료!") except: print("페이지 로딩 시간 초과 - 그래도 진행합니다...") time.sleep(3) # 로딩 실패 시 추가 대기
# 추가 대기 (동적 콘텐츠가 완전히 로드되도록) time.sleep(2)
# 책 정보 추출 - 정확한 선택자 사용 # ml-4와 w-full 클래스를 가진 div가 각 책의 컨테이너 book_containers = driver.find_elements( By.CSS_SELECTOR, "div.ml-4.w-full" )
print(f"발견된 책 컨테이너: {len(book_containers)}개\n")
if not book_containers: print("책 목록을 찾을 수 없습니다.") print("페이지 HTML 구조 확인이 필요합니다.") print("'page_source.html' 파일을 확인하세요.") return []
for idx, container in enumerate(book_containers, 1): try: # 책 제목 추출 - prod_link 클래스의 a 태그 try: title_elem = container.find_element(By.CSS_SELECTOR, "a.prod_link") title = title_elem.text.strip() except: print(f"항목 {idx}: 제목을 찾을 수 없습니다.") continue
if not title: continue
# 저자 추출 - line-clamp-2 클래스를 가진 div author = "저자 정보 없음" try: author_div = container.find_element( By.CSS_SELECTOR, "div.line-clamp-2" ) author_text = author_div.text.strip()
# "·"로 구분된 경우 (저자·역자·출판사 등) if '·' in author_text: parts = author_text.split('·') if len(parts) >= 2: author = parts[0].strip() # "지음"이 포함된 경우 elif '지음' in author_text: author = author_text.replace('지음', '').strip() # 그냥 텍스트만 있는 경우 elif author_text and len(author_text) < 50: author = author_text except: pass # 저자 정보가 없는 경우 기본값 사용
books.append({ 'rank': idx, 'title': title, 'author': author })
except Exception as e: print(f"항목 {idx} 처리 중 오류: {e}") continue
# 결과 출력 if books: print(f"\n교보문고 주간 베스트셀러 (총 {len(books)}권)\n") print("=" * 80) for book in books: print(f"{book['rank']:2d}. {book['title']}") print(f" 저자: {book['author']}") print("-" * 80) else: print("책 정보를 추출할 수 없습니다.")
return books
except Exception as e: print(f"오류 발생: {e}") import traceback traceback.print_exc() return []
finally: if driver: driver.quit()
if __name__ == "__main__": print("교보문고 베스트셀러 크롤링 시작...") print("Selenium을 사용하여 페이지를 로딩합니다.\n")
books = crawl_kyobo_bestseller_selenium()
# CSV로 저장 if books: with open('kyobo_bestseller.csv', 'w', encoding='utf-8-sig', newline='') as f: writer = csv.DictWriter(f, fieldnames=['rank', 'title', 'author']) writer.writeheader() writer.writerows(books) print(f"\n결과가 'kyobo_bestseller.csv' 파일로 저장되었습니다.") |
실행 결과입니다.
교보문고 베스트셀러 크롤링 시작...
Selenium을 사용하여 페이지를 로딩합니다.
페이지 로딩 중...
페이지 로딩 완료!
발견된 책 컨테이너: 20개
교보문고 주간 베스트셀러 (총 20권)
================================================================================
1. 트렌드 코리아 2026
저자: 김난도 외
--------------------------------------------------------------------------------
2. 절창
저자: 구병모
--------------------------------------------------------------------------------
3. 다크 심리학
저자: 다크 사이드 프로젝트
--------------------------------------------------------------------------------
4. 사탄탱고
저자: 크러스너호르커이 라슬로
--------------------------------------------------------------------------------
5. 위버멘쉬
저자: 프리드리히 니체
--------------------------------------------------------------------------------
6. 머니 트렌드 2026
저자: 김도윤 외
--------------------------------------------------------------------------------
7. 모순
저자: 양귀자
--------------------------------------------------------------------------------
8. 주식 투자의 뿌리
저자: 박두환
--------------------------------------------------------------------------------
9. 시대예보: 경량문명의 탄생
저자: 송길영
--------------------------------------------------------------------------------
10. 혼모노
저자: 성해나
--------------------------------------------------------------------------------
11. 렛뎀 이론
저자: 멜 로빈스
--------------------------------------------------------------------------------
12. 박곰희 연금 부자 수업
저자: 박곰희
--------------------------------------------------------------------------------
13. 손자병법
저자: 손자
--------------------------------------------------------------------------------
14. 대형주 추세추종 투자법칙
저자: 이종호(전황)
--------------------------------------------------------------------------------
15. 어른의 품위
저자: 최서영
--------------------------------------------------------------------------------
16. 다정한 사람이 이긴다
저자: 이해인
--------------------------------------------------------------------------------
17. 자몽살구클럽
저자: 한로로
--------------------------------------------------------------------------------
18. ETF 투자의 모든 것
저자: 문일호
--------------------------------------------------------------------------------
19. 흔한남매 20
저자: 흔한남매
--------------------------------------------------------------------------------
20. 사카모토 데이즈 23: 신생 살연
저자: Yuto Suzuki
--------------------------------------------------------------------------------
결과가 'kyobo_bestseller.csv' 파일로 저장되었습니다.
kyobo_bestseller.csv 파일에 다음처럼 저장됩니다.
rank,title,author
1,트렌드 코리아 2026,김난도 외
2,절창,구병모
3,다크 심리학,다크 사이드 프로젝트
4,사탄탱고,크러스너호르커이 라슬로
5,위버멘쉬,프리드리히 니체
6,머니 트렌드 2026,김도윤 외
7,모순,양귀자
8,주식 투자의 뿌리,박두환
9,시대예보: 경량문명의 탄생,송길영
10,혼모노,성해나
11,렛뎀 이론,멜 로빈스
12,박곰희 연금 부자 수업,박곰희
13,손자병법,손자
14,대형주 추세추종 투자법칙,이종호(전황)
15,어른의 품위,최서영
16,다정한 사람이 이긴다,이해인
17,자몽살구클럽,한로로
18,ETF 투자의 모든 것,문일호
19,흔한남매 20,흔한남매
20,사카모토 데이즈 23: 신생 살연,Yuto Suzuki