프로그램으로 웹사이트의 페이지를 옮겨 가면서 데이터를 추출하는 작업
웹 크롤링(Web Crawling)이라고도 부른다.
books = books_df[['no', 'ranking', 'bookname', 'authors', 'publisher', 'publication_year', 'isbn13']]
books.head()
Ioc는 메서드이지만 대괄호를 사용해서 행의 목록과 열의 목록을 받는다.
첫 번째 매개변수로 행의 목록을 전달.
두 번째 매개변수로 열의 목록을 전달
💡 iloc
- 인덱스의 위치를 사용.
- 열 이름이 곧 인덱스. 열 인덱스라고도 부름.
e.g.)
books_df.iloc[[0,1], [2,3]]
리스트 대신 슬라이스 연산자(:) 를 쓸 수도 있다. (💡 파이썬의 슬라이싱과 다르게 마지막 항목도 포함한다.)
e.g.)
books_df.loc[0:3, 'no':'publisher']
파이썬 슬라이싱처럼 스텝을 지정할 수도 있다.
e.g.)
books_df.loc[::2, 'no':'isbn13']
import requests
isbn = 9788936434120 # '소년이 온다: 한강 장편 소설' isbn
url = 'http://www.yes24.com/Product/Search?domain=BOOK&query={}'
r = requests.get(url.format(isbn))
print(r.text) # HTML 출력
from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text, 'html.parser')
💡 BeautifulSoup
- 첫번째 매개변수는 파싱할 HTML 문서
- 두번째 매개변수는 파싱에 사용할 파서 (Parser)
- Parser: 입력 데이터를 받아 데이터 구조를 만드는 소프트웨어 라이브러리
# 예시
soup.find('div', attrs={'id': 'search'})
id 속성이 search인 div 태그를 찾으라는 의미
# 도서 상세 페이지 링크 찾기
prd_link = soup.find('a', attrs={'class':'gd_name'})
도서 상세 페이지 링크 찾기 결과
# 링크 주소 얻기
prd_link['href']
도서 상세페이지 링크 주소 조회 결과
💡 find()와 find_all()의 차이점
- find()는 지정된 이름을 가진 첫번째 태그를,
- find_all()은 지정된 이름을 가진 모든 태그를 찾는다.
def get_page_cnt(isbn):
url = 'http://www.yes24.com/Product/Search?domain=BOOK&query={}'
r = requests.get(url.format(isbn))
soup = BeautifulSoup(r.text, 'html.parser')
prd_info = soup.find('a', attrs = {'class': 'gd_name'})
if prd_info == None:
return ''
url = 'http://www.yes24.com' + prd_info['href']
r = requests.get(url) # 도서 상세 페이지 가져오기
soup = BeautifulSoup(r.text, 'html.parser')
prd_detail = soup.find('div', attrs={'id': 'infoset_specific'})
prd_tr_list = prd_detail.find_all('tr')
for tr in prd_tr_list:
if tr.find('th').get_text() == '쪽수, 무게, 크기':
return tr.find('td').get_text().split()[0]
return ''
💡 merge() 함수 더 알아보기
on 매개변수
합칠 때 기준이 되는 열을 지정한다. 이 열은 두 데이터프레임에 모두 존재해야 한다.
on 매개변수에 지정한 열의 값이 같은 행끼리 합쳐진다.
pd.merge(df1, df2, on='col1')
how 매개변수
pd.merge(df1, df2, how='left', on='col1')
pd.merge(df1, df2, how='right', on='col1')
pd.merge(df1, df2, how='outer', on='col1')
left_on, right_on 매개변수
# df1의 col1 열, df2의 col3 열 기준으로 합침
pd.merge(df1,df2, left_on='col1', right_on='col3')
left_index, right_index 매개변수
pd.merge(df1, df2, left_on='col1', right_index=True)
💡 웹 스크래핑은 만능 도구가 아니며 최후의 수단으로 사용하는 것이 좋다.
다음과 같은 데이터프레임 df가 있을 때 loc 메서드의 결과가 다른 하나는 무엇인가요?
1. df.loc[[0,1,2], ['col1','col2']]
2. df.loc[0:2, 'col1':'col2']
3. df.loc[:2, [True,True]]
4. df.loc[::2, 'col1':'col2'] 💡(정답)
- loc 메서드는 파이썬 slicing과 마찬가지로
시작 index, 끝 index, step을 지정할 수 있다.
- 파이썬 slicing과 다른 점은 loc 메서드는 끝 인덱스를 포함한다.
⬇️ 4번 결과
p137-138 손코딩 실습으로 원하는 도서의 페이지 수를 추출하고 화면 캡처하기