본문 바로가기

개발일지/도서추천서비스

[Python] 교보 문고 크롤링 하기 with Selenium & BeautifulSoup

반응형

목차

  1. 동적 페이지 크롤링
  2. Selenium & BeautifulSoup
  3. 크롤링 할 데이터 목록
  4. 초기 셋팅
  5. 코드 및 결과

 

1.  동적 페이지 크롤링

동적 웹페이지는 정적 웹페이지와 다르다.

정적 페이지는 html에 이미 모든 정보를 담고 있다.

인터넷에 접속하여 서버에 요청을 보내면 서버는 저장되어 있는 html 문서를 클라이언트에게 그대로 전송한다.

따라서 모든 사용자들에게 동일한 웹페이지가 보여진다.

블로그, 기업 정보 페이지, 포트폴리오 사이트 등을 예로 들 수 있다.

 

반면 동적 페이지의 경우, 사용자의 요청에 따라 데이터가 변경되고 화면에 보여지는 콘텐츠에도 변동이 적용된다.

오늘 크롤링 할 교보 문고 웹페이지도 동적 페이지에 해당한다.

※ 교보문고 홈페이지 : https://www.kyobobook.co.kr/

 

 

2.  Selenium & BeautifulSoup

Selenium은 웹 애플리케이션의 자동화 테스트를 위해 개발된 라이브러리이다.

자바스크립트를 실행하고 웹을 조작할 수 있는 다양한 기능을 제공하기 때문에,

주로 웹 브라우저에서 작업을 자동화하고 동적인 웹페이지 데이터를 추출하는데 사용된다.

 

BeautifulSoup은 정적인 HTML이나 XML 문서를 파싱하고 조작하기 위한 파이썬 라이브러리이다.

여기서 조작은 Selenium과 같은 JS 실행을 통한 웹 조작을 말하는 것이 아니라

요소 검색이나 태그 안에 있는 데이터 추출, DOM을 직접 조작하는 등의 작업을 말한다.

BeautifulSoup은 Javascript를 실행하지 않기 때문에 동적 웹페이지 스크롤에는 적합하지 않다.

다만 HTML 파싱에는 특화되어 유연한 기능을 제공한다.

 

따라서 우리는 Selenium으로 동적인 웹페이지에서 필요한 데이터가 모두 로드된 상태를 확보한 후에

BeautifulSoup으로 해당 HTML 소스를 파싱하여 원하는 데이터를 추출할 것이다!

 

 

3.  크롤링 할 데이터 목록

● 교보문고 : 국내도서 > 소설 > 한국소설 > 로맨스소설

https://product.kyobobook.co.kr/category/KOR/010111#?page=1&type=all&per=50&sort=new

 

● 칼럼구조 : [책코드, 제목, 작가, 소개, 리뷰별점]

 

● 크롤링 조건

1. 리뷰가 30개 미만인 도서 정보는 제외

2. 19세 이상 상품은 제외

 

 

4.  초기 셋팅

1. selenium을 사용하기 위해 pip install selenium 실행

2. 웹드라이버를 설치 brew install --cask chromedriver

    - 해당 페이지에서는 크롬으로 설명한다.

3. BeautifulSoup 설치 pip install beautifulsoup4

from selenium import webdriver
from chromedriver_autoinstaller import install as install_chromedriver
from bs4 import BeautifulSoup
import time

# Chrome 웹 드라이버 설치 및 설정
install_chromedriver()
driver = webdriver.Chrome()

# 교보문고 접속
url = f"https://product.kyobobook.co.kr/category/KOR/010315#?page=1&type=all&per=50&sort=new"
driver.get(url)

time.sleep(5)

해당 코드를 실행했을 때 교보문고 웹페이지가 열리고 5초 뒤에 자동 종료 된다면 성공이다.

 

 

5.  코드 및 결과

# 페이지의 HTML 가져오기
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

 

HTML 문서의 내용을 파싱한 객체를 soup 변수에 저장하였다.

이제 가져올 데이터를 고르면 되는데 여기서부터는 해당 웹페이지에서

크롬 개발자 도구를 열고 구조를 살펴봐야 한다.

사진을 보면 도서 정보 리스트가 prod_item이라는 클래스 명을 가진 li 태그로 나열되어 있는 것을 볼 수 있다.

li 태그를 모두 크롤링 해와서 각각의 li 태그 안에 도서 별 정보를 빼낼 수 있다.

 

beautifulSoup의 select_one을 사용하면 처음 하나의 요소를,

select를 사용하면 존재하는 모든 요소를 리스트로 읽어올 수 있다.

아래는 해당 코드이다.

 

# li 태그 모두 가져오기
items = soup.select('.prod_item')

# 크롤링 해 온 데이터를 담을 배열
data = []

# 각 li 태그에서 책 정보 가져오기
for item in items:

    # 책번호
    link_number = item.find('a', class_="prod_link")['href'].split("/")[-1].strip()
    # 제목
    title = item.find('span', class_="prod_name").get_text(strip=True)
    labels = item.find('span', class_="prod_label")
    if labels is not None:
      for label in labels:
          title = title.replace(label.text.strip(), '')

    # 작가
    author = item.find('span', class_="prod_author").find('a').text.strip()
    # 책소개
    introduction = item.select_one('.prod_introduction').text.strip()
    # 리뷰
    review = item.select_one('.review_klover_text').text.strip()

    data.append((link_number, title, author, introduction, review))

 

제목을 가져올 때 문제점이 있었는데 prod_name 안에 있는 텍스트를 가져올 때 label도 같이 붙어 오는 문제였다.

위의 사진을 예시로 들자면 '하렘의 남자들 5' 만 제목으로 저장하고 싶은데

'예약판매 하렘의 남자들 5'로 제목이 저장되는 것이다.

그래서 label 태그를 replace를 사용하여 빈 문자열(' ')로 대체하는 과정을 넣어 순수한 제목만 저장되도록 만들었다.

# 데이터프레임 생성 후 CSV로 저장
df = pd.DataFrame(data, columns=['Num', 'Title', 'Author', 'Introduction', 'Review'])
df.to_csv('books.csv', index=False)

# 드라이버 종료
driver.quit()

위와 같이 종료 후 생성된 CSV파일을 열어보면 원하는 정보가 잘 크롤링 된 것을 확인할 수 있다.

books.csv 샘플데이터

만약 staleElementReferenceException이 발생한다면

화면에 정보가 로드되기 전에 해당 태그를 읽어오려고 해서 생긴 예외일 수 있다.

해당 exception이 터진 곳에서 driver.implicitly_wait(5) 을 사용해서 해결할 수 있다.

driver.implicitly_wait(5)은 웹 요소가 로드될 때까지 명시적으로 대기하도록 하는 Selenium 웹드라이버의 기능 중 하나이다.

 

 

[ 참고 자료 ]

 

[mac] m1 웹 크롤링 Selenium, Chromedriver 설치하기

크롤링을 위한 Selenium, Chromedriver를 설치해보자. 나는 m1 맥북을 사용하기 때문에 해당 환경 기준으로 진행해 보았다. 1. Selenium 설치 먼저 셀레니움은 웹 자동화 테스트 도구이다. 셀레니움을 통해

ddingmin00.tistory.com

 

 

[파이썬:웹크롤링] #12 동적 웹페이지 크롤링 with Selenium

[왕초보 웹크롤링 따라하기] 웹크롤링, 파이썬, 웹자동화, 셀레니움, Selenium #12 동적 웹페이지 크롤링 정적/동적 사이트의 이해 (바로가기 Click) 동작 자동화, 셀레니움(selenum) (바로가기 Click) 웹

charimlab.tistory.com