혼공분석 2주 차 학습
# | 진도 | 기본 숙제 | 추가 숙제 |
2주차 (07. 07 ~ 07. 13) |
Chapter 02 | p.150 확인 문제 1번 | p. 137 ~ 138 도서 페이지 수 출력 |
기본 숙제
- loc 메서드
- 인덱스와 열 이름 사용
- df.loc[::2, 'col1':'col2'] → 첫 번째 행과 세 번째 행만 선택
- BeautifulSoup - tag
- tag.find_all('table')
- find_all(): 지정한 태그를 모두 찾아 리스트로 반환
- tag('table')
- tag.find_all('table')과 같은 의미
- find_all() 메서드는 생략 가능
- 동작은 하지만 가독성과 유지보수 측면에서 사용하지 않는 것이 좋음
- tag.find('table')
- find(): 조건에 맞는 첫 번째 태그 하나만 반환
- tag.find(id='table')
- id가 'table' 속성인 첫 번째 태그를 반환
- tag.find_all('table')
추가 숙제
- Open API: 도서관 정보나루 - Open API 활용방법 - 인기대출도서 조회
- 기간: 2025.06.01 ~ 2025.06.30
- 나이: 20대
- 크롤링 출처: Yes24
- 도서의 쪽수 구하기
import requests
from bs4 import BeautifulSoup
def get_page_cnt(isbn):
# Yes24 도서 검색 페이지 URL
url = 'https://www.yes24.com/product/search?domain=ALL&query={}'
# URL에 ISBN을 넣어 HTML 가져오기
r = requests.get(url.format(isbn))
# HTML 파싱
soup = BeautifulSoup(r.text, 'html.parser')
# 검색 결과에서 해당 도서 선택
prd_info = soup.find('a', attrs={'class':'gd_name'})
# 검색 결과에 도서가 없는 경우 빈 문자열 반환
if prd_info == None:
return ''
# 도서 상세 페이지 가져오기
url = 'https://www.yes24.com' + prd_info['href']
r = requests.get(url)
# HTML 파싱
soup = BeautifulSoup(r.text, 'html.parser')
# 제목 <h2> 선택
prd_title = soup.find('h2', attrs={'class':'gd_name'}).get_text()
# 품목정보 <div> 선택
prd_detail = soup.find('div', attrs={'id':'infoset_specific'})
# 테이블에 있는 <tr> 태그 가져오기
prd_tr_list = prd_detail.find_all('tr')
# 쪽수가 들어 있는 <th>를 찾아 <td>에 담긴 값 반환
for tr in prd_tr_list:
if tr.find('th').get_text() == '쪽수, 무게, 크기':
prd_page = tr.find('td').get_text().split()[0]
return f'제목: {prd_title} | 쪽수: {prd_page}'
# 쪽수만 반환할 경우, return prd_page
get_page_cnt(9788936434120)
# '제목: 소년이 온다 | 쪽수: 216쪽'
도서 판매 사이트에서 1차적으로 ISBN으로 검색을 하게 된다. 그리고 검색 결과를 통해 2차적으로 해당 도서의 상세 페이지로 넘어가게 된다. 이를 위해서 도서 상세 페이지로 넘어가는 URL을 찾아야 하는데 해당 URL은 class 이름이 'gd_name'인 <a> 태그에 있는 것을 확인할 수 있다.
도서 상세 페이지로 넘어가게 되면 우리는 도서의 정보를 확인할 수 있다. 먼저, 제목의 경우에는 class 이름이 'gd_name'인 <h2> 태그에 있는 것을 확인할 수 있다.
마지막으로 쪽수는 id가 'infoset_specific'인 <div> 태그 안에 있는 것을 확인할 수 있다. 해당 <div> 태그 안에는 테이블 형식으로 데이터가 들어있는데, '쪽수, 무게, 크기'에 해당하는 행인 <tr> 태그를 찾아 <td> 태그 안에 있는 텍스트를 가져오면 된다. 그 후, split() 메서드를 사용해 첫 번째 문자열만 가져오면 된다.
top10_books = books.head(10)
page_count = top10_books.apply(lambda row: get_page_cnt(row['isbn13']), axis=1)
print(page_count)
"""
0 제목: 소년이 온다 | 쪽수: 216쪽
1 제목: 홍학의 자리 | 쪽수: 336쪽
2 제목: 모순 | 쪽수: 308쪽
3 제목: 나는 소망한다 내게 금지된 것을 | 쪽수: 368쪽
4 제목: 작별하지 않는다 | 쪽수: 332쪽
5 제목: 지구 끝의 온실 | 쪽수: 392쪽
6 제목: 물고기는 존재하지 않는다 | 쪽수: 300쪽
7 제목: 급류 | 쪽수: 300쪽
8 제목: 채식주의자 | 쪽수: 276쪽
9 제목: 바깥은 여름 | 쪽수: 272쪽
dtype: object
"""
이때, books는 도서관 정보나루에서 제공한 인기대출도서 조회 Open API 키를 통해 가져온 데이터이다. Pandas의 DataFrame은 한 행씩 순차적으로 처리하기보다는 apply() 메서드를 통해 각 행에 함수를 적용할 수 있다. axis가 0이면 각 열에 대해서, 1이면 각 행에 대해서 함수를 적용한다.
혼공분석 2주 차 회고
해당 도서에서는 Yes24 사이트를 크롤링하였기 때문에 나는 교보문고 사이트를 크롤링해보려고 하였다. 하지만 Requests와 BeautifulSoup으로는 정보를 가져올 수 없었다. 따라서 이 경우에는 Selenium으로 시도해야 한다고 판단했고, 성공했다.
'혼공학습단 > 혼자 공부하는 데이터 분석 with 파이썬' 카테고리의 다른 글
[혼공분석] 6주차. 복잡한 데이터 표현하기 (2) | 2025.08.17 |
---|---|
[혼공분석] 5주차. 데이터 시각화하기 (1) | 2025.08.10 |
[혼공분석] 4주차. 데이터 요약하기 (4) | 2025.07.27 |
[혼공분석] 3주차. 데이터 정제하기 (0) | 2025.07.20 |
[혼공분석] 1주차. 데이터 분석을 시작하며 (2) | 2025.07.06 |