from bs4 import BeautifulSoup
import urllib
이번 시간에는 지난 블로그에 이어 도서의 제목을 가지고 오는 실습을 진행하도록 하겠습니다.
이번 예시에서는 BeautifulSoup과 urllib 두 가지 라이패키지가 필요합니다. urllib는 내장 함수로 별도로 설치할 필요가 없고 BeautifulSoup만 설치해 주시면 됩니다.
pip install bs4
패키지 import
from bs4 import BeautifulSoup
import urllib
사용자처럼 서버에 요청을 보내고 서버에서는 보낸 응답을 받는 소스코드입니다.
# 검색할 사이트
root_url = "http://www.yes24.com/24/category/bestseller?CategoryNumber=117&sumgb=06"
# HTML 헤더
# 브라우저로 흉내내기, 아닐 경우에는 block 당할 확률이 높음
head = {'User-Agent' : "Magic Browser"}
# 요청보내기
request = urllib.request.Request(root_url, headers = head)
# 응답 받기
response = urllib.request.urlopen(request)
# 응답을 Beautifulsoup 패키징화하기
# 한글로 디코딩해 주기, 아니면 한글이 깨짐
soup = BeautifulSoup(response.read().decode('euc-kr','replace'))
다음은 Beautifulsoup 패키지의 기능을 알아보겠습니다.
Beautifulsoup 패키지를 사용한 응답
결과를 보시면 beautifulsoup 패키지를 사용하면 깔끔하게 출력이 되는 것을 알 수 있습니다.
soup = BeautifulSoup(response.read().decode('euc-kr','replace'))
print(soup)
이로써 전체 HTML 페이지를 갖고 왔습니다. 이젠 우리가 원하는 데이터가 있는 부분을 찾도록 하겠습니다.
일반적으로 웹 사이트는 아주 많은 layout으로 구성이 되어있고 각 layout은 자신의 "id" 혹은 "class"를 갖고 있어 구분이 가능하게 합니다.
content = soup.find_all('table', {'id':'category_layout'})
아래 그림을 보시면 각 도서 정보는 <tr>...</tr> 태그에 감싸있는 것을 확인할 수 있습니다. 그리고 이러한 태그가 아주 많이 반복이 됩니다. 우리는 프로그램을 통해 순차적으로 탐색하면서 도서의 정보를 갖고 올 것입니다.
# 도서 정보를 포함하고 있는 html table
content = soup.find_all('table', {'id':'category_layout'})
#각 도서를 의미하는 tr 태그
book_list = content[0].find_all('tr')
# <tr> 태그 개수
print(len(book_list))
태그 개수는 최종적으로 33이 될 것입니다. 그 이유는 아래 그림처럼 다른 글도 <tr> 태그를 사용하기 때문입니다. 즉 도서 정보, 기타 글, 도서 정보, 기타 글... 이런 형식으로 되어 있습니다. 도서의 정보만 추출하기 위해 조건문을 두어 기타 글은 스킵하겠습니다.
# 첫번째 도서의 제목 갖고오기
for i in range(0, 1):
print(book_list[i].findAll("p")[0].text)
이번에는 전체 도서 정보를 갖고 오도록 하겠습니다. HTML 코드를 탐색하면 아시겠지만 제목은 <p>...</p>에 쌓여 있습니다.
# 전체 <tr> 태그에 있는 데이터를 반복문을 통해 추출
for i in range(0, len(book_list)):
# 도서 정보만 갖고 오기 위한 규칙
if i % 2 ==0:
# 도서 제목만 갖고 오기
print((book_list[i].find_all("p")[0].text).strip())
이로써 도서 제목을 가져오는 크롤링 실습을 마치겠습니다.
다음 시간에는 크롤러를 이용해 도서 이미지를 다운로드 받는 실습을 진행하겠습니다.
하시다가 잘 안되거나 이해가 되지 않는 부분이 있으시면 질문을 남겨 주세요~
'크롤러(Crawler)' 카테고리의 다른 글
[python] 웹 크롤러(Web crawler) 실습-03_이미지 다운로드 (0) | 2020.05.04 |
---|---|
[python] 웹 크롤러(Web crawler) 실습-01_HTML 구조 확인 (0) | 2020.05.04 |
[python] 웹 크롤러(Web crawler)-01.개념 (0) | 2020.05.02 |