크롤링 서비스이니 만큼, 주 기능은 크롤링이다. 책 재고를 긁어오기 위해 두 가지가 필요하다 생각했다.
- 책에 관한 정보
- 해당 책 재고
책에 관한 정보
책에 관한 정보를 처음에는 네이버 책 페이지에서 받아왔는데, 찾아보니 API가 있었다. API는 크롤링보다 빠르고 간단하다...ㅎㅎ 이에 대한 내용은 다음에 API에 관한 글을 적으면서 다룰 예정이다.
책 재고 크롤링
이번 글의 주제인 크롤링. 재고를 긁어오기 위해 교보문고에서 재고를 올리는 URL을 확인했다. 살펴보니 책의 isbn을 이용해 재고를 확인하는 jsp 페이지로 접속이 가능했다. 아래 링크에서 **isbn**이라고 적힌 곳에 책의 isbn을 입력하면 접속 가능하다.
http://www.kyobobook.co.kr/prom/2013/general/StoreStockTable.jsp?barcode=**isbn**&ejkgb=KOR
네이버 북 API에서 받아온 isbn을 URL에 넣어서 재고를 크롤링 해오기로 했다. 이를 위해 짠 코드는 아래에.
import requests
from bs4 import BeautifulSoup as BS
def getStock(isbn):
url = 'http://www.kyobobook.co.kr/prom/2013/general/StoreStockTable.jsp?barcode=' + isbn + '&ejkgb=KOR'
res = requests.get(url)
soup = BS(res.text, 'html.parser')
# 비어있는 태그들 삭제
[x.decompose() for x in soup.findAll(lambda tag: (not tag.contents or len(tag.get_text(strip=True)) <= 0))]
store = soup.select('th')
num = soup.select('a')
stock = {}
for i, j in zip(store, num):
i = i.text
i = i.strip()
if i == '':
pass
else:
stock[i] = j.text
return stock
크롤링에 사용한 모듈
getStock이라는 함수를 구현하기 위해 requests와 BeautifulSoup 두 가지 모듈을 사용했다. 이 글에서 라이브러리에 대한 설명을 자세히 하기 시작하면 너무 길어질 것 같으니, 모듈에 관한 글은 따로 작성하도록 하겠다.
requests
requests를 이용하면 파이썬으로 http 통신을 할 수 있다. 간단히 확인해 보자.
변수 res에 네이버로 requets를 요청한 내역을 담아 print하면 200이 출력되는 걸 볼 수 있다. 이 200은 http 상태 코드다. 즉, 제대로 통신이 되었다는 의미다. 이 res는 DOM구조로 읽어온 html 문서를 담고 있다.
DOM이란?
Beautiful Soup
Beautiful Soup은 html, xml 등의 문서를 쉽게 파싱할 수 있도록 도와주는 모듈이다.
store = soup.select('th')
위의 코드는 DOM 문서 내에서 th태그만 가져오겠다는 의미다. 태그가 아니라 좀 더 특징적인 내용을 선택하고 싶을 경우에는 CSS Selector를 이용하면 된다.
#BeautifulSoup에서 CSS Selector 사용법
soup.select('태그')
soup.select('.클래스명') 혹은 ('태그.클래스명')
soup.select('#아이디명') 혹은 ('태그#아이디명')
soup.select('태그 > 자식태그')
soup.select('태그 자손태그')
사용예는 https://neung0.tistory.com/30?category=754836 이 글에서 확인 가능하다.
'만들기 > 재고 검색 사이트' 카테고리의 다른 글
04. Requests를 향한 여정 (0) | 2019.09.06 |
---|---|
03. 재고 크롤러(2) (0) | 2019.09.04 |
01. (0) | 2019.09.02 |