[아이티윌 빅데이터 52기] LAB 12 | 웹 데이터 수집하기 | 카카오 검색 결과 수집
카카오의 도서 검색 결과를 모두 가져오기 위해서는 어떻게 해야할까?
요청 url 에서 page 파라미터를 통해 도서 검색 결과 페이지의 쪽수를 컨트롤 할 수있었는데,
이 값들을 최대치인 50까지 모두 다 가져오기 위해서 반복문을 결합해보자
STEP 1. 라이브러리 참조하기
STEP 2. 요청 정보 확인
STEP 3. 웹 데이터 요청하기
STEP 4. 데이터 저장하기
STEP 1. 라이브러리 참조하기
import requests
from pandas import DataFrame
STEP 2. 요청 정보 확인
#요청 URL
url ="https://dapi.kakao.com/v3/search/book"
#QueryString 요청 변수
query ="파이썬"
page =1
size =50
#header 에 포함할 키
key = "ba2b91a53d05dab15c540eff6f1c5565"
STEP 3. 웹 데이터 요청하기
page 값을 전달하는 파라미터 부분에 반복문으로 1- 50 까지 i 를 전환시키고,
이떄 오류가 발생하더라도 중단되지 않도록 continue 예외 처리를 걸어준다.
만약 웹 통신이 정상적으로 200 처리가 되었다면, 생성해둔 비워진 리스트 resultset 에 결과 mydict 을 extend 해서 이어 붙이고, 이 작업을 반복한다
#요청 결과를 저장하기 위한 리스트
resultset =[]
with requests.Session() as session:
session.headers.update({
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
"Authorization" : "KakaoAK %s" %key
})
for i in range(1,51):
r=session.get(url,params={"query":query,"page":i,"size":size}) #반복문을 통해 i 가 1-50으로 바뀐다
if r.status_code !=200:
msg ="[%d Error] %s 에러가 발생함" % (r.status_code,r.reason)
# 기존에는 HTTP 상태값이 200이 아니면 강제로 에러를 발생시켜 코드를 중단시켰지만 >> raise Exception (msg)
print(msg)
continue # 이제는 에러가 발생해도 메세지 로그는 남기지만 건너뛰고 계속 진행
print("%d page 데이터 수신 완료 >> %s" % (i,r))
r.encoding ="utf-8"
mydict = r.json()
resultset.extend(mydict['documents'])
print("총 %d 건의 데이터가 수집되었습니다" % len(resultset))

STEP 4. 데이터 저장하기
df = DataFrame(resultset)
df.to_excel("카카오 책 검색(%s) - 전체 데이터 .xlsx" % query)

이번에는 표지 이미지들을 다운받아보자!
수집된 데이터 중 임의의 한 건을 확인해보면, thumnail 이라는 key 에 책 표지 이미지가 맵핑되어 있다
#수집된 데이터 중 임의의 한 건을 확인해보면, thumnail 이라는 key 에 책 표지 이미지가 멥핑되어 있다
print(resultset[0])
{'authors': ['박응용'], 'contents': '개정 2판으로 새롭게 태어났다!
챗GPT를 시작으로 펼쳐진 생성 AI 시대에 맞춰 설명과 예제를 다듬고,
최신 경향과 심화 내용을 보충했다. 또한 이번 개정 2판도 50만 코딩
유튜버인 조코딩과 협업을 통해 유튜브 동영상을 제공해 파이썬을 더 쉽게
공부할 수 있다. 8년 연속 베스트셀러! ',
'datetime': '2023-06-15T00:00:00.000+09:00',
'isbn': '1163034738 9791163034735',
'price': 22000, 'publisher': '이지스퍼블리싱',
'sale_price': 19800, 'status': '정상판매',
'thumbnail': 'https://search1.kakaocdn.net/thumb/R120x174.q85/?fname=http%3A%2F%2Ft1.daumcdn.net%2Flbook%2Fimage%2F6361131%3Ftimestamp%3D20250709143830',
'title': 'Do it! 점프 투 파이썬', 'translators': [],
'url': 'https://search.daum.net/search?w=bookpage&bookId=6361131&q=Do+it%21+%EC%A0%90%ED%94%84+%ED%88%AC+%ED%8C%8C%EC%9D%B4%EC%8D%AC'}
파일 다운로드 함수 정의
기본 url 은 url, 다운 받으려는 이미지 항목은 target 파라미터로 받아올 함수 download 를 정의.
헤더에는 open api 접근을 위한 유저 에이전트 항목 작성
여러 항목 다운로드 중 에러 발생 가능성 방지를 위해 try-except 로 감싸줌
try 구문에서는 세션 객체에 url 정보를 읽어온 정보를 r 에 담고, 이때 대용량 파일 다운로드 시 메모리 절약을 위해 데이터를 스트리밍으로 받아오는 옵션을 True 로 해줌
그 다음 target 으로 정의된 다운받을 항목을 바이너리(이미지) 형식으로 읽어 기록해준다
# 파일 다운로드 함수 정의
def download(url,target):
session.headers.update({
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
})
try :
r=session.get(url,stream=True)
r.encoding = "utf-8"
with open(target,"wb") as f:
f.write(r.raw.read())
print(target, "가 저장되었습니다")
except Exception as e:
print(target, "저장 실패",e)
print(r)
[동기식] 반복문을 통해 수집된 결과 내의 표지 이미지 다운로드 받기
1. 라이브러리 임포트
2. 결과 폴더 이름 생성
- dirname 를 통해 매번 실행될 때마다 고유한 폴더명이 생겨 이전 다운로드와 겹치지 않도록 할 수 있음
3. 폴더 생성
4. 루프 시작
5. 파일 경로 문자열 생성
- os.path.join()은 운영체제에 맞게 경로를 합쳐
- Windows → "20251105-143021\\0.jpg"
6. 다운로드 함수 호출
import os
import datetime as dt
#다운로드 결과가 저장될 폴더 생성하기
dirname = dt.datetime.now().strftime("%Y%m%d-%H%M%S")
os.mkdir(dirname)
#수집 데이터 내에서 반복문 수행
for i ,v in enumerate(resultset):
file_path = os.path.join(dirname,"%d.jpg" %i)
download(v["thumbnail"],file_path)

[비동기식] 파일 다운로드
#비동기 처리 기능을 제공하는 모듈
from concurrent import futures
#다운로드 결과가 저장될 폴더 생성하기
dirname = dt.datetime.now().strftime("%Y%m%d-%H%M%S")
os.mkdir(dirname)
#비동기 작업 내에서 이미지 다운로드 받기
with futures.ThreadPoolExecutor() as executor:
#수집 데이터 내에서 반복문 수행
for i,v in enumerate(resultset):
#저장될 파일 경로 문자열 생성
file_path = os.path.join(dirname,"%d.jpg" %i)
#비동기 다운로드 요청
executor.submit(download,v['thumbnail'],file_path)

'빅데이터 국비 교육' 카테고리의 다른 글
| [아이티윌 빅데이터 52기] LAB 12 | 웹 데이터 수집하기 | 네이버 트렌드 데이터 API (0) | 2025.11.05 |
|---|---|
| [아이티윌 빅데이터 52기] LAB 12 | 웹 데이터 수집하기 | 카카오 개발자 API | 책 검색 결과 수집 (0) | 2025.11.05 |
| [아이티윌 빅데이터 52기] LAB 12 | 웹 데이터 수집하기 | 영화 진흥 위원회 API | 박스 오피스 데이터 수집 (0) | 2025.11.05 |
| [아이티윌 빅데이터 52기] LAB 11 | 웹 데이터 수집하기 1 (0) | 2025.11.04 |
| [아이티윌 빅데이터 52기] LAB 10 | Python Basic | Flask 웹 프로그래밍 (0) | 2025.11.03 |