교보문고 종합 주간 베스트 웹크롤링 파이썬 예제

webnautes
By -
0

교보문고 웹사이트의 종합 주간 베스트를 웹크롤링하여 책이름과 저자를 출력하는 파이썬 예제 코드입니다.

클로드 코드를 사용하여 생성했습니다.




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


댓글 쓰기

0 댓글

댓글 쓰기 (0)