반응형
from bs4 import BeautifulSoup 
import urllib

이번 시간에는 지난 블로그에 이어 도서의 제목을 가지고 오는 실습을 진행하도록 하겠습니다.

 

 

[python] 웹 크롤러(Web crawler) 실습-01

안녕하세요. 지난 시간에 이어 python을 이용한 웹 크롤러를 만드는 시간을 갖도록 하겠습니다. 웹 크롤러 개념은 아래 링크에서 확인하시면 감사하겠습니다. [python] 웹 크롤러(Web crawler)-01.개념 안녕하세요..

python-an.tistory.com

 

이번 예시에서는 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())

 

결과

 

이로써 도서 제목을 가져오는 크롤링 실습을 마치겠습니다.

 

다음 시간에는 크롤러를 이용해 도서 이미지를 다운로드 받는 실습을 진행하겠습니다.

 

하시다가 잘 안되거나 이해가 되지 않는 부분이 있으시면 질문을 남겨 주세요~

 

 

python 배우기 : 네이버 카페

본 카페에서는 python 프로그래밍을 함계 학습하고 더 나아가 python을 이용해 크롤러, 기계학습을 학습

cafe.naver.com

 

 

python 학습(데이터분석, 딥러닝)

본 카페는 python 프로그래밍 언어를 배우고 이를 활용해 웹 크롤러(web crawler), 기계학습(machine learning) 등 여러가지 분야를 알아보고자 합니다.

cafe.daum.net

 

+ Recent posts