YES 24 크롤링
베스트셀러 순위권의 정보 크롤링
1. yes24 베스트셀러 페이지
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' 이다.
위의 코드를 그대로 실행하면 평점이 아닌 책의 가격을 가져오게 된다.
따라서, 평점의 '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이라는 소수만 가져오기 위해 문자열 슬라이스를 추가한다.
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 |