Python

crawling 3 - YES 24 예제

retill28 2024. 7. 11. 02:01

 

 

YES 24 크롤링 

베스트셀러 순위권의 정보 크롤링

 

 

1. yes24 베스트셀러 페이지 

베스트 셀러 페이지
베스트셀러 정보를 포함하고 있는 요소와 그 요소에 대한 html 코드

 

 

 

 

2. 베스트 셀러 데이터를 수집한다. 

가져올 데이터 : 제목, 저자, 출판사, 출간일, 리뷰수, 평점

데이터  class 이름 
제목 gd_name
링크 gd_name
저자 info_auth
출판사 info_pub
평점 yes_b

 

 class 이름을 찾는 과정은 아래 스크린샷들을 참고 

단 링크는, 이름을 클릭하면 연결되는 링크를 뜻하므로, 제목과 class 이름이 같다.

 

 

 

 

3-1. 코딩 - 홈페이지 이동 

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

url = 'https://www.yes24.com/Product/Category/BestSeller?categoryNumber=001&pageNumber=1&pageSize=24'
browser.get(url)

 

 

 

3-2. 코딩 - 책 1개의 데이터 수집

# 책 1개 데이터 수집
제목 = browser.find_element(By.CLASS_NAME, 'gd_name').text
링크 = browser.find_element(By.CLASS_NAME, 'gd_name').get_attribute('href')
저자 = browser.find_element(By.CLASS_NAME, 'info_auth').text
출판사 = browser.find_element(By.CLASS_NAME, 'info_pub').text
출간이 = browser.find_element(By.CLASS_NAME, 'info_date').text
평점 = browser.find_element(By.CLASS_NAME, 'yes_b').text

 

여기서 발생한 문제 - 책의 가격을 담은 className도 평점이랑 같은 'yes_b' 이다. 

위의 코드를 그대로 실행하면 평점이 아닌 책의 가격을 가져오게 된다. 

책의 가격 class name : yes_b
책의 평점 class name : yes_b

따라서, 평점의 'yes_b'보다 상위인 'rating_grade'를 불러와, 그것의 자식속성인 'yes_b'를 호출한다. 

즉, 코드를 아래와 같이 find_element()를 두번 쓰도록 수정한다. 

# 책 1개 데이터 수집
제목 = browser.find_element(By.CLASS_NAME, 'gd_name').text
링크 = browser.find_element(By.CLASS_NAME, 'gd_name').get_attribute('href')
저자 = browser.find_element(By.CLASS_NAME, 'info_auth').text
출판사 = browser.find_element(By.CLASS_NAME, 'info_pub').text
출간이 = browser.find_element(By.CLASS_NAME, 'info_date').text
평점 = browser.find_element(By.CLASS_NAME, 'rating_grade').find_element(By.CLASS_NAME, 'yes_b').text

 

 

 

3-3. 코딩 - 컨테이너 호출 

책 전체의 정보를 담고 있는 컨테이너를 호출, 호출한 컨테이너에서 원하는 데이터 수집

# 컨테이너 수집
books = browser.find_elements(By.CLASS_NAME, 'itemUnit')
len(books)

 

 

 

3-4. 코딩 - 페이지 순회

url을 분석해, 1페이지부터 4페이지까지의 변하는 부분을 찾는다.

이를 바탕으로 반복문을 만들어 url을 순회하게끔 한다. 

아래에선 pageNumber={i} 부분이 변하므로, {i}로 바꿔넣는다.

url = 'https://www.yes24.com/Product/category/bestseller?CategoryNumber=001&sumgb=06'
browser.get(url)

bestsellers = []


titles = browser.find_elements(By.CLASS_NAME, 'gd_name')
authors = browser.find_elements(By.CLASS_NAME, 'info_auth')
companies = browser.find_elements(By.CLASS_NAME, 'info_pub')
dates = browser.find_elements(By.CLASS_NAME, 'info_date')
sells = browser.find_elements(By.CLASS_NAME, 'saleNum')
reviews = browser.find_elements(By.CLASS_NAME, 'rating_rvCount')
rates = browser.find_elements(By.CLASS_NAME, 'rating_grade')


for i in range(len(titles)):  
    title = titles[i].text
    author = authors[i].text
    company = companies[i].text
    date = dates[i].text
    sell = sells[i].text
    review = reviews[i].text
    rate = rates[i].text
    
    bestsellers.append({
        '제목': title,
        '저자': author,
        '출판사': company,
        '출간일': date,
        '판매지수': sell,
        '리뷰수': review,
        '평점': rate
    })

bestsellers

 

 

 

3-5. 코딩 - 문자열 슬라이스 

위의 book_list를 출력하면, 다음과 같다. 

평점들을 보면 ' 리뷰 총점 N.N 정보 더 보기/감추기 ' 형식으로 출력이 된다. 

이중에서 N.N이라는 소수만 가져오기 위해 문자열 슬라이스를 추가한다. 

3-4코딩의 출력 결과

 

url = 'https://www.yes24.com/Product/category/bestseller?CategoryNumber=001&sumgb=06'
browser.get(url)

bestsellers = []


titles = browser.find_elements(By.CLASS_NAME, 'gd_name')
authors = browser.find_elements(By.CLASS_NAME, 'info_auth')
companies = browser.find_elements(By.CLASS_NAME, 'info_pub')
dates = browser.find_elements(By.CLASS_NAME, 'info_date')
sells = browser.find_elements(By.CLASS_NAME, 'saleNum')
reviews = browser.find_elements(By.CLASS_NAME, 'rating_rvCount')
rates = browser.find_elements(By.CLASS_NAME, 'rating_grade')


for i in range(len(titles)):  
    title = titles[i].text
    author = authors[i].text
    company = companies[i].text
    date = dates[i].text
    sell = sells[i].text
    review = reviews[i].text
    rate = rates[i].text
    grade = rate.split(' ')[1]   #문자열 슬라이스 부문 추가
    
    bestsellers.append({
        '제목': title,
        '저자': author,
        '출판사': company,
        '출간일': date,
        '판매지수': sell,
        '리뷰수': review,
        '평점': grade
    })

bestsellers

 

문자열 슬라이스 이후 출력 결과

 

'Python' 카테고리의 다른 글

crawling 5 - SRT 예매 프로그램  (0) 2024.07.11
crawling 4 - Google Playstore 리뷰 예제  (0) 2024.07.11
crawling 2 - DBPIA 예제  (0) 2024.07.11
crawling 1 - Selenium  (0) 2024.07.10
데이터 시각화 1  (0) 2024.07.05