Captain's Log
← Observatory
Observatory·

데이터 수집 첫걸음 — 공공 API와 크롤링, 그리고 DB 저장

소상공인 상권정보 API로 치킨집 데이터를 수집하고, 하나은행 환율을 read_html로 크롤링해 자동화하고, Selenium+DB까지 — 데이터를 '가져와서 쌓는' 파이프라인의 첫 경험.

TrainingScrapingAPI

API에서 데이터 가져오기

첫 대상은 소상공인시장진흥공단 상가(상권)정보 API. 활용가이드의 오퍼레이션 명세를 읽고, requests.get(url, params=payload) 로 요청을 조립하는 것부터 시작했다.

url = "http://apis.data.go.kr/B553077/api/open/sdsc2/storeListInUpjong"
payload = dict(divId="indsSclsCd", key="I21006",  # 소분류코드(치킨)
               numOfRows=100, pageNo=1, type="json",
               serviceKey=os.getenv("service_key"))
r = requests.get(url, params=payload)

핵심 학습 포인트:

  • 응답 코드 확인(200 정상), r.text / r.json() 의 차이
  • totalCount 를 뽑아 전체 페이지 수를 계산하고 반복 수집(페이지네이션)
  • 같은 데이터를 jsonxml 두 포맷으로 받아 비교
  • 수집 결과를 DataFrame 으로 정리해 CSV로 저장
  • time.sleep() 으로 API 호출 속도를 조절해 서버 부담 줄이기

크롤링으로 환율 수집 자동화

API가 없는 데이터는 직접 긁는다. 하나은행 환율 페이지를 pd.read_html 로 읽었다. 이때 OSError 를 만났는데, HTML 텍스트를 파일처럼 다루기 위해 StringIO 로 감싸는 방법을 배웠다.

  • datetimepd.date_range 로 날짜를 생성해 여러 날치를 반복 수집(스케줄러 개념)
  • 수집된 DataFrame의 컬럼 이름을 .columns / .values 로 정리
  • 최종 결과를 DB에 저장

Selenium과 DB 구성

정적 요청으로 안 되는 페이지는 Selenium으로 브라우저를 직접 제어했다. 그리고 수집한 데이터를 SQLAlchemy + pymysql 로 MySQL에 적재하며, 크롤링 → 정제 → 저장으로 이어지는 자동 수집 파이프라인을 처음 완성했다.

정리

"데이터를 어디서, 어떻게 가져오는가"에는 여러 층이 있다는 걸 배웠다. API가 가장 깔끔하고, 없으면 정적 크롤링, 그것도 막히면 브라우저 자동화. 그리고 가져온 데이터는 결국 DB에 쌓여야 반복 가능한 자산이 된다.